앱 만들기 [Vala + Gtk 3] (2 부)

이 두 번째 부분에서는 응용 프로그램의 논리를 빌드합니다 (코드를 더 잘보고 분석하여 코드를 전체적으로보고 분석하여 게시물 아래에 넣을 것입니다). 그 전에 sqlite3 라이브러리를 설치해야합니다. 질문과 각각의 답변을 저장하는 데 사용 :

sudo apt-get install libsqlite3-dev

라이브러리가 설치되면 "using Sqlite"만 필요합니다. vala에서 sqlite를 사용할 수 있습니다.

다음을 포함하는 테이블을 만들어야합니다.

문제
답변 1
답변 2
답변 3
답변 4
옳은

예 :

질문=이다 desdelinux 좋은 블로그?

답변 1 = 해당 블로그가 존재하지 않습니다.
답변 2 = 아니오
답변 3 = 예
Answer4 = 안녕하세요

우리 모두는 정답이 2 (좋은 사람은 3)

맞음 = 3

테이블을 생성하고 처리하려면 sql (좋아하는 검색 엔진에서 검색 할 수 있습니다.), 테이블을 만드는 문 :

CREATE TABLE preguntas (pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT);
질문 삽입… :

INSERT INTO 질문(질문, 답변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 질문 ( 질문 TEXT, 답변1 TEXT, 답변2 TEXT, 답변3 TEXT, 답변4 TEXT, 올바른 INT ); INSERT INTO 질문(질문, 답변1, 답변2, 답변3, 답변4, 정답) VALUES('is desdelinux 좋은 블로그입니다', '블로그가 아닙니다', '아니요', '예', '안녕하세요', 3); INSERT INTO 질문(질문, 답변1, 답변2, 답변3, 답변4, 정답) VALUES ('5+5', '25', '10', '3', '5', 2); """; ec = db.exec(쿼리, null, errmsg 출력); if(ec != Sqlite.OK) { stderr.printf("오류: %s\n", errmsg); } } }

오류가 없는지 확인하십시오.

 if (ec! = Sqlite.OK) {stderr.printf ( "오류 : % s \ n", errmsg); 반환 -1; }

질문과 답변을 할당하는 데 도움이되는 6 개의 문자열을 만들 것입니다.

 개인 문자열 p; 개인 문자열 r1; 개인 문자열 r2; 개인 문자열 r3; 개인 문자열 r4; 개인 문자열 c;

SELECT를 사용하여 질문 (test.db에서 가져옴) 배치 :

 private void bd_select_questions () {string query = "SELECT question, answer1, answer2, answer3, answer4, correct FROM questions ORDER BY RANDOM ()"; int rc = db.prepare_v2 (쿼리, -1, 출력 stmt, null); int cols = stmt.column_count (); rc = stmt. 단계 (); int col; if (rc == Sqlite.ROW) {for (col = 0; col <cols; col ++) {string txt = stmt.column_text (col); if (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; } // print ( "% 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");
});

시간 논리는 이전 게시물에서 보았 듯이 시간이 1에 도달하면 답이 틀렸다는 것을 확인하는 if 만 추가하면됩니다.

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 Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.

  1.   파비안

    튜토리얼에 대해 대단히 감사합니다. 간단한 것으로 시작하려는 우리에게는 매우 흥미로 웠습니다. 데이터 테이블을 만드는 데 더 많은 도움이 필요합니다. 건배

  2.   미묘한

    아주 좋아요! 잘 설명되고 상세합니다. 데이터 감사합니다. (과)

  3.   rho

    감사합니다! 처음으로 매우 흥미 롭습니다.
    다양한 보완 인스턴스, 유형 주석 (유형 팝업) 또는 메뉴 (기본 또는 그놈 쉘에 나타나는 패널 유형)를 보는 것이 좋을 것입니다.
    진실은 아주 좋습니다.
    우리는 읽습니다 : =)