在我的MainWindow中,我有一个按钮和一个菜单栏项目,其信号都连接到同一个插槽。在插槽功能中,我写道:
mainWindow->setCursor(QCursor(Qt::WaitCursor));
当通过按钮调用插槽函数时,这可以正常工作;但是,当从菜单调用相同的函数时,不会出现等待光标。知道为什么吗?
我还考虑过使用QApplication :: setOverrideCursor;然而,这会导致其他问题。
有什么建议吗?谢谢!
(我正在使用Qt 4.7并使用Qt Creator和默认的MinGW编译器在Windows 7上进行开发。)
这里有更多细节。
MainWindow构造函数中的:this->setCursor(Qt::CrossCursor);
信号/插槽连接:
QObject::connect(button, SIGNAL(clicked()), MainWindow, SLOT(showMessageBox()));
QObject::connect(action, SIGNAL(triggered()), MainWindow, SLOT(showMessageBox()));
showMessageBox函数:
void MainWindow::showMessageBox()
{
this->setCursor(Qt::WaitCursor);
// display wait cursor briefly before showing message box
for (int i = 0; i < 1<<30; ) {++i;}
QMessageBox msgBox;
msgBox.setText("Hello!");
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.setCursor(Qt::PointingHandCursor);
msgBox.exec();
this->setCursor(Qt::CrossCursor);
}
使用'button'调用showMessageBox
时,等待光标将按预期显示。
通过'action'调用showMessageBox
时,不会出现等待光标;而不是从Qt的:: CrossCursor一旦用户选择“操作”菜单项,然后一旦消息框打开变为Qt的:: PointingHandCursor光标变成一个Qt :: ArrowCursor。等待光标永远不会出现。
答案 0 :(得分:0)
您的代码是同步的,并使用延迟循环。当你进入延迟循环时,任何Qt代码都无法执行。光标更改需要事件循环旋转 - 因此它会从您给出的症状中显示出来。
以下是如何正确执行 - 请记住,如果您在GUI代码中使用延迟/睡眠和其他阻止调用,您的用户会讨厌您,这是正确的。在消息/对话框中使用exec()也是不好的风格。您的应用程序是异步的,请编写代码。确保您的插槽被声明为(在MainWindow声明的受保护插槽:部分中)。
void MainWindow::showMessageBox()
{
this->setCursor(Qt::WaitCursor);
QTimer::singleSlot(200, this, SLOT(slot1()); // fire slot1 after 200ms
}
void MainWindow::slot1()
{
QMessageBox * msgBox = new QMessageBox(this);
msgBox->setText("Hello!");
msgBox->setStandardButtons(QMessageBox::Ok);
msgBox->setCursor(Qt::PointingHandCursor);
msgBox->show();
connect(msgBox, buttonClicked(QAbstractButton*), SLOT(slot2(QAbstractButton*)));
}
void MainWindow::slot2(QAbstractButton* button)
{
// a button was clicked on the message box
this->setCursor(Qt::CrossCursor);
}