在這一部分中,我們將了解如何創建另一個窗口並使用 GTK 進行設計。 我們還將看到一些功能,例如添加問題和使用三個按鈕(50%、凍結和通過)。
工具欄和工具按鈕
創建一個工具欄:
創建一個 ToolButton,在本例中我們將在其上放置一個圖標(您可以找到許多默認圖標 這裡)與“from_stock(Gtk.Stock.IconName):
我們可以看到,在我們的應用程序中,頂部有一個帶有兩個按鈕的欄,我們將使用第一個按鈕創建新問題,第二個按鈕用於導入問題(通過文件):
創建問題:
單擊我們之前創建的按鈕(在工具欄中)將打開一個新的 gtk 窗口,該窗口允許我們向數據庫添加問題:
為了創建一個新窗口,我們將創建一個新類,我們將其稱為 Questions,並且像我們的 App 類一樣,我們將創建一個新窗口 (this.window = new Gtk.Window();)
我們將使用一些組件按順序創建圖形界面;
-標籤(問題)
– 條目(我們將在其中寫問題)
- 標籤(回复)
– 4 個水平框,其中包含一個條目(答案)和一個開關(選擇是否正確)
- 按鈕(完成)
我們可以看到它的樣子:
為了保存問題,我們必須獲取條目的文本,它們是通過返回字符串的 get_text() 獲得的。
要知道 Switch 是否處於活動狀態,我們可以使用它的方法 獲取活動 () 如果打開則返回 true,如果關閉則返回 flase。
50%、凍結和跳過按鈕:
-50%:
對於 50%,我們只需查看哪個按鈕是正確的,然後刪除 2 個不正確的按鈕,在這種情況下,我們使用 set_sensitive(false) 取消它們。
結果:
-凍結:
我們再次將欄設置為 0。
this.bar_time.set_fraction(0);
-經過:
button3.clicked.connect (() => {
this.bd_select_preguntas ();
this.next_pregunta();
});
下一部分(4):
在下一部分中,我們將看到如何改進應用程序的各個方面,例如問題並不總是出現在同一位置,在應用程序上放置一個圖標......
我喜歡這些答案……哈哈..問候
Vala 上的這些文章非常好。我期待其他文章。問候
我正在等待你進入瓦拉,我希望有很多交貨。 問候!
好文章,謝謝分享。
HOLA,
我已經按照您之前的條目創建了這個應用程序,現在問題來了,我嘗試訪問新窗口的條目,我在 createQuestions 類(創建窗口的類)的 saveC 方法中這樣做。
公共無效saveC(){
字符串str=askE.get_text();
stdout.printf("論文 %s\n", str);
}
但在輸出中我得到這個:
(bu:6196):Gtk-CRITICAL **:gtk_entry_get_text:斷言“GTK_IS_ENTRY(條目)”失敗
已處理(空)
我看過一些示例,在訪問條目的方法的定義中,它們執行如下操作:
void on_activate(Gtk.Entry 條目) {
名稱=entry.get_text();
print("\n你好" + 姓名 + "!\n\n");
}
但他們只有一個條目,在這個例子中有 5 個,所以我在這裡迷路了,你能更好地指導我嗎?
好吧,當您創建條目時,您不會給它們提供相同的名稱,為了獲取它們所擁有的文本,您可以這樣做:
r1 = Entry1.get_text();
r2 = Entry2.get_text();
r3 = Entry3.get_text();
r4 = Entry4.get_text();
如果你願意的話,放一個pastebin,我來看看
lolbimbo 是的,事實上我有不同的名稱,但我只使用一個進行測試,因為它們都沒有返回我在條目中輸入的文本,它向我發送了上述錯誤:
但在輸出中我得到這個:
(bu:6196):Gtk-CRITICAL **:gtk_entry_get_text:斷言“GTK_IS_ENTRY(條目)”失敗
已處理(空)
我繼續調查...
乾杯。!!
這裡準備好了來源,問候。
http://pastebin.com/pZG8GbrY
你好 Hiram,看,我會告訴你如何解決它,發生這種情況的第一件事是我們正在創建一個新窗口(它不是主窗口),並且在調用條目時,(抱歉對於這些詞)我不知道為什麼它他媽的不返回,就好像它是一個條目,而是一個小部件,但是嘿,要修復它,您只需使用以下命令將您創建的所有靜態組件更改為動態組件變量:
var AskE = new Gtk.Entry();
然後該功能將起作用,您將收到條目內的文本。
保存.clicked.connect(() => {
//字符串str = this.questionE.get_text();
stdout.printf("論文 %s\n", AskE.get_text());
});
最後,不要忘記更改添加條目以顯示它的行:
askE.show();
我將經過修改的完整代碼留給您,以便您可以驗證它是否已經有效,即您是否必須更改所有元素(至少是條目)才能繼續應用程序。
http://paste.desdelinux.net/5048
問候
Chale,在這裡再次困擾我,我一直遇到問題,你向我展示的代碼工作正常,只有在事件中發生了一些事情:
保存.clicked.connect(() => {
//字符串str = this.questionE.get_text();
stdout.printf("論文 %s\n", AskE.get_text());
});
它位於 Questions 類內部,工作正常,但是當我想從 saveC 輸入它時,它無法編譯,它給了我這個錯誤:
bu01.vala:50.38-50.50:錯誤:參數 1:無法從“Questions.saveC”轉換為“Gtk.Button.clicked”
this.save.clicked.connect(this.saveC);
^^^^^^^^^^^^^^
bu01.vala:251.58-251.66: 警告:Gtk.Stock 自 3.10 起已被棄用
bu01.vala:260.59-260.67: 警告:Gtk.Stock 自 3.10 起已被棄用
編譯失敗:1 個錯誤,2 個警告
我想這是因為我在點擊事件發生時傳遞參數的方式:
this.save.clicked.connect(this.saveC);
預先非常感謝您的反饋; 這是引發錯誤的代碼: http://pastebin.com/pLzExhrb
我還沒有測試過它,但我認為從函數中刪除參數會丟棄它。
公共無效saveC(Gtk.Entry AskE){
字符串str=askE.get_text();
stdout.printf("論文 %s\n", str);
}
a:
公共無效saveC(){
字符串str=askE.get_text();
stdout.printf("論文 %s\n", str);
}
lolbimbo,我已經嘗試刪除爭論,但它仍然不起作用,
我仍在嘗試理解這個問題,我是 Vala 的新手,我找不到太多文檔,我希望盡快找到解決方案或等到你發布第四部分 xD。
我繼續努力...
問候。