无法从菜单操作更改Qt主窗口中的光标

时间:2011-02-28 03:58:37

标签: qt qt4 cursor

在我的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。等待光标永远不会出现。

1 个答案:

答案 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);
}