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", "");
}
}
}
任何想法如何,我可以得到返回的值?
在這種情況下,您也可以[直接調用方法](https://qt-project.org/doc/qt-5/qmetaobject.html#invokeMethod)。 – lpapp
@Alosyius,如果您的問題的答案是正確的,請選中該答案的向上/向下投票圖標旁邊的勾號標記。它不僅可以幫助那些花時間幫助你的人,而且還可以節省閱讀你問題的人的時間,以便最終發現它已經被正確回答。 – TheDarkKnight
@ Merlin069:我認爲他們有15分鐘的限制,但我同意。 – lpapp