C++ 信号的QT返回值?

C++ 信号的QT返回值?,c++,qt,C++,Qt,我在一个单独的线程中运行所有SQLite数据库操作,以确保GUI不会冻结 我通过连接方法的信号和插槽来实现这一点 但是,现在我需要找到一种方法,让SQLite线程将所选值返回到我的主线程 我的头文件: class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); // .... // .... sign

我在一个单独的线程中运行所有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;
};
然后,我在一个单独的线程中打开
main窗口中的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);
// 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", "");
        }
    }
}
最后,在我的应用程序中,我想查询SQLite数据库中的一些信息,并收到一个返回值:(仍在
main窗口中


您知道如何获取返回值吗?

当发射器和接收器位于不同的线程中时,您应该有一个Qt::BlockingQueuedConnection类型的连接

所以应该是这样的:

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

当您发出信号时,它会导致当前线程阻塞,直到插槽返回。

在这种情况下,您也可以。@Alosyius,如果您的问题的答案是正确的,请通过选择该答案的向上/向下投票图标旁边的勾号进行标记。这不仅是对那些花时间帮助你的人的赞扬,而且也节省了那些阅读你的问题最后才发现答案正确的人的时间。@Merlin069:我想他们有15分钟的时间限制,但我同意。@Merlin069 Sorry正在等待计时器限制:)如果
getUserNick
的实现访问数据库,这实际上就破坏了拥有第二个线程的目的。解决此类问题的标准方法是在信号/插槽对之间有两个连接:一个用于请求,另一个用于响应。
connect(this, SIGNAL(getUserNickS(QString)), dbtrad, SLOT(getUserNick(QString)),Qt::BlockingQueuedConnection);