2014-05-22 85 views
0

我正在一個單獨的線程中運行我所有的SQLite數據庫操作,以確保GUI不會凍結。QT從信號返回值?

我正在通過連接方法的信號和插槽來做到這一點。

但是現在我需要找到一種方法讓SQLite線程將選定的值返回到我的主線程。

我的頭文件:

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

// .... 
// .... 

signals: 
    QString getUserNickS(QString channel); 
} 

class dbThread : public QObject 
{ 
    Q_OBJECT 

public: 
    dbThread(); 

public slots: 
    bool openDB(QString agentID); 
    QString getUserNick(QString channel); 

private: 
    QSqlDatabase db; 
}; 

我再打開裏面MainWindow在一個單獨的線程像這樣的DB連接:

// Start database thread 
QThread * thread = new QThread(); 
dbtrad = new dbThread(); 
dbtrad - > moveToThread(thread); 

//dbtrad->openDB(agentID); 
connect(this, SIGNAL(requestOpenDB(QString)), dbtrad, SLOT(openDB(QString))); 
connect(this, SIGNAL(getUserNickS(QString)), dbtrad, SLOT(getUserNick(QString))); 

thread - > start(); 

emit requestOpenDB(userID); 

最後在我的應用程序有一點我想查詢SQLite數據庫的一些信息,並收到返回值:(仍在MainWindow內)

QString retVal = getUserNickS(channelId); 
qDebug() << "RET VALUE -----> " + retVal; 

getUserNick方法是這樣的:

// Returns visitor nickname for a channelId 
QString dbThread::getUserNick(QString channel) { 
    bool ret = false; 

    if (db.isOpen()) { 
     QSqlQuery query(db); 

     ret = query.exec(QString("select * from visitorInfo WHERE channelID = '%1' order by date(time) ASC LIMIT 1;").arg(channel)); 

     if (ret) { 
      bool gotResults = false; 
      while (query.next()) { 
       gotResults = true; 
       qDebug() << query.value(14).toString(); 
       return query.value(14).toString(); 
      } 
      if (!gotResults) { 
       qDebug() << "Name " + channel.replace("V", ""); 
       return "Name " + channel.replace("V", ""); 
      } 

     } else { 
      qDebug() << "Name " + channel.replace("V", ""); 
      return "Name " + channel.replace("V", ""); 
     } 
    } 
} 

任何想法如何,我可以得到返回的值?

回答

1

當發射器和接收器在不同的線程中時,你應該有一個類型爲Qt :: BlockingQueuedConnection的連接。

所以它應該是這樣的:

connect(this, SIGNAL(getUserNickS(QString)), dbtrad, SLOT(getUserNick(QString)),Qt::BlockingQueuedConnection); 

當你發出你的信號,這導致當前線程阻塞,直到返回插槽。

+1

在這種情況下,您也可以[直接調用方法](https://qt-project.org/doc/qt-5/qmetaobject.html#invokeMethod)。 – lpapp

+0

@Alosyius,如果您的問題的答案是正確的,請選中該答案的向上/向下投票圖標旁邊的勾號標記。它不僅可以幫助那些花時間幫助你的人,而且還可以節省閱讀你問題的人的時間,以便最終發現它已經被正確回答。 – TheDarkKnight

+0

@ Merlin069:我認爲他們有15分鐘的限制,但我同意。 – lpapp