Невозможно изменить курсор в главном окне Qt из действия меню - PullRequest
2 голосов
/ 28 февраля 2011

В моем главном окне у меня есть кнопка и пункт меню, сигналы которого подключены к одному и тому же слоту. В слот-функции я написал:

mainWindow->setCursor(QCursor(Qt::WaitCursor));

Работает как положено, когда функция слота вызывается кнопкой; однако, когда та же функция вызывается из меню, курсор ожидания не появляется. Есть идеи почему?

Я также рассмотрел использование QApplication :: setOverrideCursor; однако это вызывает другие проблемы.

Есть какие-нибудь рекомендации? Спасибо!

(Я использую Qt 4.7 и занимаюсь разработкой под Windows 7 с использованием Qt Creator со стандартным компилятором MinGW.)

Вот более подробно.

в конструкторе 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);
}

Когда showMessageBox вызывается с помощью кнопки, курсор ожидания отображается, как и ожидалось.

Когда showMessageBox вызывается через «действие», курсор ожидания не появляется; вместо этого курсор изменится с Qt :: CrossCursor на Qt :: ArrowCursor, как только пользователь выберет пункт меню «действие», а затем изменится на Qt :: PointingHandCursor, как только откроется окно сообщения. Курсор ожидания никогда не появляется.

1 Ответ

0 голосов
/ 29 мая 2012

Ваш код является синхронным и использует цикл задержки. Когда вы находитесь в цикле задержки, нет никакого способа для выполнения кода 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...