所以我遇到的情况是,我无法按照我希望的顺序启动几个插槽。
基本设置是我有一个主窗口,其状态栏需要根据来自子窗口小部件(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
}
任何有启发性的信息都会非常感激!
答案 0 :(得分:0)
我怀疑这不是一个排序问题,但SQL查询阻止了主GUI事件循环的事实:尝试在QApplication::processEvents()
调用后插入emit searchStatus(...)
的电话。如果我没错,您应该在数据库搜索完成之前看到状态栏更新。
但是,由于您仍在阻止事件循环,因此在执行数据库调用时,您的GUI仍会冻结,这并不是很好。您可以通过在不同的线程上运行查询来消除此问题(最简单的方法之一是通过http://doc.qt.io/qt-5/qtconcurrent.html#run),但要注意您必须担心并发问题(例如,现在您可以多次单击go按钮连续......)。