了解信号,插槽顺序和父窗口小部件

时间:2016-02-09 20:15:07

标签: qt signals-slots

所以我遇到的情况是,我无法按照我希望的顺序启动几个插槽。

基本设置是我有一个主窗口,其状态栏需要根据来自子窗口小部件(SearchWidget)的信号进行更新。当在子窗口小部件上单击“开始”按钮时,我希望它更新状态栏以说“搜索...”然后执行实际的数据库搜索。但是,我只能在搜索完成后触发updateStatusBar插槽并显示在tablewidget中。我已经尝试重新安排连接到适当的顺序,我尝试了一个单独的函数,发出状态栏的信号,然后搜索信号,但似乎没有任何工作。搜索始终首先执行,状态栏在完成后才会更改。

我是新手,但我猜这个问题可能与主窗口和小部件之间的父子关系有关?也许同一小部件​​中的插槽在某种程度上优先考虑?请参阅下面的基本代码。

Mainwindow类:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
    initMembers();
    initUI();

    connect(searchWidget, SIGNAL(searchingStatus(QString)), this, SLOT(updateStatusBar(QString)));

}

void MainWindow::initMembers()
{
    tabWidget = new QTabWidget(this);
    searchWidget = new SearchWidget(this);
    saleWidget = new SaleWidget(this);

    statusBar = new QStatusBar();

    setCentralWidget(tabWidget);
    setStatusBar(statusBar);
}

void MainWindow::initUI()
{
    tabWidget->addTab(searchWidget, "Search");
    tabWidget->addTab(saleWidget, "Sale Data");
}


void MainWindow::updateStatusBar(QString status)
{
    statusBar->showMessage(status);
}

SearchWidget类:

SearchWidget::SearchWidget(QWidget *parent) : QWidget(parent)
{

    connect(goButton, SIGNAL(clicked), this, SLOT(buildQuery()));

}

void SearchWidget::buildQuery()
{
    emit searchingStatus("Searching...");
   //builds sql query
}

任何有启发性的信息都会非常感激!

1 个答案:

答案 0 :(得分:0)

我怀疑这不是一个排序问题,但SQL查询阻止了主GUI事件循环的事实:尝试在QApplication::processEvents()调用后插入emit searchStatus(...)的电话。如果我没错,您应该在数据库搜索完成之前看到状态栏更新。

但是,由于您仍在阻止事件循环,因此在执行数据库调用时,您的GUI仍会冻结,这并不是很好。您可以通过在不同的线程上运行查询来消除此问题(最简单的方法之一是通过http://doc.qt.io/qt-5/qtconcurrent.html#run),但要注意您必须担心并发问题(例如,现在您可以多次单击go按钮连续......)。