創建一個應用程序[Vala + Gtk 3](第二部分)

在第二部分中,我們將構建應用程序的邏輯(為了更好地查看和分析代碼以完整地了解它,我將其放在文章的下面),但是在此之前,我們需要安裝sqlite3庫用於保存問題及其相應的答案:

sudo apt-get install libsqlite3-dev

一旦安裝了庫,我們只需要一個“使用Sqlite”即可。 才能在vala中使用sqlite。

我們將需要創建一個包含以下內容的表:

問題
答案1
答案2
答案3
答案4
正確

例如:

問題=是 desdelinux 一個好的部落格?

答案1 =該博客不存在
答案2 =否
答案3 =是
答案4 =你好

因為我們都會知道正確答案是2(好人是3)

正確= 3

要創建表並處理它,我們需要知道sql(您可以在自己喜歡的搜索引擎中進行搜索),創建表的語句:

CREATE TABLE preguntas (pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT);
插入問題...:

INSERT INTO questions (問題、答案1、答案2、答案3、答案4、正確) VALUES ('es desdelinux 一個好部落格', '這不是部落格', '不', '是', '你好', 3);

好,現在得到一個問題(隨機排序):

SELECT pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto FROM preguntas ORDER BY RANDOM()

打開數據庫:

int ec = Sqlite.Database.open ("test.db", out db);
if (ec != Sqlite.OK) {
stderr.printf ("Can't open database: %d: %s\n", db.errcode (), db.errmsg ());
}

如果我們還沒有創建它(第一次運行代碼),它將自動創建。

從2013-11-06 19:48:02捕獲

創建表並插入問題:

 私人無效 bd() { 字串 errmsg; // 開啟資料庫/建立資料庫 int ec = Sqlite.Database.open("test.db", out db); if (ec != Sqlite.OK) { stderr.printf("無法開啟資料庫: %d: %s\n", db.errcode (), db.errmsg ()); } if (!FileUtils.test ("test.db", FileTest.IS_REGULAR)) { string query = """ CREATE TABLE questions (問題TEXT, 答案1 文本, 答案2 文本, 答案3 文本, 答案4 文本, 正確的INT ); INSERT INTO 問題 (問題、答案 1、答案 2、答案 3、答案 4、正確) VALUES ('是 desdelinux 一個好部落格', '這不是部落格', '不', '是', '你好', 3); INSERT INTO 問題 (問題、答案1、答案2、答案3、答案4、正確) VALUES ('5+5', '25', '10', '3', '5', 2); """; ec = db.exec (query, null, out errmsg); if (ec != Sqlite.OK) { stderr.printf ("錯誤: %s\n", errmsg); } } }

檢查是否沒有錯誤:

 如果(ec!= Sqlite.OK){stderr.printf(“錯誤:%s \ n”,errmsg); 返回-1; }

我們將創建6個字符串,這將有助於我們分配問題和答案。

 私有字符串p; 私有字符串r1; 私有字符串r2; 私有字符串r3; 私有字符串r4; 私有字符串c;

用SELECT放置一個問題(我們從test.db得到):

 私人無效bd_select_questions(){字符串查詢=“選擇問題,答案1,答案2,答案3,答案4,從問題中按順序隨機排序()”; int rc = db.prepare_v2(query,-1,out stmt,null); int cols = stmt.column_count(); rc = stmt.step(); int col; if(rc == Sqlite.ROW){for(col = 0; col <cols; col ++){字符串txt = stmt.column_text(col); 如果(col == 0){p = txt; } else if(col == 1){r1 = txt; } else if(col == 2){r2 = txt; } else if(col == 3){r3 = txt; } else if(col == 4){r4 = txt; } else {c = txt; } //打印(“%s =%s \ n”,stmt.column_name(col),txt); }}}

將問題放在圖形元素上:

private void next_pregunta () {
this.pregunta.set_label(this.p);
this.resposta1.set_label(this.r1);
this.resposta2.set_label(this.r2);
this.resposta3.set_label(this.r3);
this.resposta4.set_label(this.r4);
}

率:

private void puntua () {
this.punts = this.punts + 50;
this.puntos.set_label(this.punts.to_string());
}

如果答案正確,請嘗試:


private void correcto (string cor) {
if (this.c == cor) {
this.puntua ();
this.bd_select_preguntas ();
this.next_pregunta();
}
else{
//incorrecto
}
}

resposta1.clicked.connect (() => {
this.correcto("1");
});
resposta2.clicked.connect (() => {
this.correcto("2");
});
resposta3.clicked.connect (() => {
this.correcto("3");
});
resposta4.clicked.connect (() => {
this.correcto("4");
});

正如我們在上一篇文章中看到的那樣,時間邏輯只需要添加一個if即可驗證時間是否達到1,我們給出的答案是錯誤的:

從2013-11-03 12:58:42捕獲

編譯(我們添加–pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3

創建三個按鈕(50%,凍結,通過):

我們創建一個新的水平Gbox並添加三個按鈕,然後將此Gbox添加到我們已經創建的Gbox中:

this.box2 = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0);
var button1 = new Gtk.Button.with_label ("50%");
var button2 = new Gtk.Button.with_label ("congelar");
var button3 = new Gtk.Button.with_label ("passar");
this.box2.pack_start(button1);
this.box2.pack_start(button2);
this.box2.pack_start(button3);

this.box.pack_start (box2);

從2013-11-06 20:48:46捕獲

完整的代碼: http://paste.desdelinux.net/4882


發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責數據:MiguelÁngelGatón
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   法比安 他說:

    非常感謝您的教程,對於那些想從簡單開始的人來說非常有趣,在創建數據表這一部分我需要更多幫助。 問候

  2.   細微的 他說:

    挺好! 好解釋和詳細。 感謝您的數據。 (是)

  3.   rho 他說:

    謝啦! 作為第一個非常有趣。
    最好看到各種互補的實例,鍵入註釋(那些類型的彈出窗口)或菜單(鍵入出現在基本或gnome-shell中的面板的那些)...
    真相很好。
    我們讀:=)