2017-08-25 65 views
0

我在一個需要執行選擇查詢(我使用sqlite作爲sql引擎)並將結果加載到QTextEdit(我爲圖形界面使用QT)的項目中工作。
現在我只寫了下面的代碼(但我還是堅持在我需要追加結果到的QTextEdit的部分):如何在QTextEdit面板中追加選擇查詢結果?

//Callback function to print the query to the console 
int db_files::CallBack(void *notUsed, int argc, char **argv, char **azColName) { 
    for(int i = 0; i<argc; i++) { 
     printf("%s : %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); 
    } 
    std::cout << "\n"; 
    return 0; 
} 

//Function where I open the database and run the query 
void custHandler::show_all() { 
    rc = sqlite3_open("database.db", &db); 
    if(rc != SQLITE_OK) { 
      sqlite3_close(db); 
      exit(1); 
     } 
     sqlCust = "SELECT * FROM DB"; 
     rc = sqlite3_exec(db, sqlCust, CallBack, 0, &ErrMsg); 
     if (rc != SQLITE_OK) { 
      exit(1); 
     } 
     sqlite3_free(ErrMsg); 
     sqlite3_close(db); 
} 

也許我需要在回調函數來操作,但我不」不知道怎麼...有人可以給我解釋一下嗎?

編輯: 我呼籲txtShow一個QTextEdit變量,我通常ui->txtShow.insertPlainText("text");

+0

您能否使用縮進來正確格式化代碼,以便我們可以輕鬆閱讀?而且,你的代碼中的任何地方都沒有QTextEdit,所以我們不知道在哪裏追加。我是否有權假定你想要在QTextEdit中添加printf到終端? – apalomer

回答

1

訪問查看sqlite3_exec()功能在SqlLite documentation的簡介:

int sqlite3_exec(
    sqlite3*,         /* An open database */ 
    const char *sql,       /* SQL to be evaluated */ 
    int (*callback)(void*,int,char**,char**), /* Callback function */ 
    void *,         /* 1st argument to callback */ 
    char **errmsg        /* Error msg written here */ 
); 

正如你看到的第四個參數是用戶定義的參數,將被傳遞給callback()函數。

所以你需要使用太多互動與您的調用代碼:

//Callback function to print the query to the console 
int db_files::CallBack(void *myQTextEdit, int argc, char **argv, char **azColName) { 
    QTextEdit* qTextEdit = (QTextEdit*)myQTextEdit; 

    for(int i = 0; i<argc; i++) { 
     // Add the results to qTextEdit as needed ... 
    } 
    return 0; 
} 

當調用sqlite3_exec()函數傳遞:

//Function where I open the database and run the query 
void custHandler::show_all() { 
    rc = sqlite3_open("database.db", &db); 
    if(rc != SQLITE_OK) { 
      sqlite3_close(db); 
      exit(1); 
     } 
     sqlCust = "SELECT * FROM DB"; 
     rc = sqlite3_exec(db, sqlCust, CallBack, &myQTextEdit, &ErrMsg); 
              // ^^^^^^^^^^^^ 

     if (rc != SQLITE_OK) { 
      exit(1); 
     } 
     sqlite3_free(ErrMsg); 
     sqlite3_close(db); 
} 

這是一個很常見的方式如何C風格API在回調函數中與用戶代碼交互。

+0

我有兩個錯誤運行你的代碼:第一個是從void到QTextEdit(在回調函數中)的轉換......看起來沒有一個方法來執行該轉換。第二個問題是在第四個參數中(在sqlite3_exec函數中)&myQTextEdit無法識別... – zDoes

+0

@zDoes _「&myQTextEdit無法識別」_您必須將您的QTextEdit控件成員的名稱當然。你不能指望你拿我的例子,它開箱即用。這只是解釋你的原理是如何工作的。 – user0042

+0

謝謝,我沒有看到它......但在回調函數QTextEdit * qTextEdit =(QTextEdit)myQTextEdit;仍然生成鑄造錯誤... – zDoes