我在一个单独的线程中运行所有SQLite数据库操作,以确保GUI不会冻结。
我通过连接方法的信号和插槽来做到这一点。
但是现在我需要找到一种方法让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
内的一个单独的线程中打开数据库连接:
// 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", "");
}
}
}
任何想法如何获得返回值?
答案 0 :(得分:1)
当发射器和接收器位于不同的线程中时,你应该有一个Qt :: BlockingQueuedConnection类型的连接。
所以应该是这样的:
connect(this, SIGNAL(getUserNickS(QString)), dbtrad, SLOT(getUserNick(QString)),Qt::BlockingQueuedConnection);
当您发出信号时,它会导致当前线程阻塞,直到返回插槽。