Dans ma fenêtre principale, j'ai un bouton-poussoir et un élément de barre de menu dont les signaux sont tous deux connectés au même emplacement. Dans la fonction de l'emplacement, je l'ai écrit:Impossible de changer le curseur dans la fenêtre principale de Qt à partir du menu action
mainWindow->setCursor(QCursor(Qt::WaitCursor));
Cela fonctionne comme prévu lorsque la fonction de l'emplacement est invoquée via le bouton; cependant, lorsque la même fonction est appelée à partir du menu, le curseur d'attente n'apparaît pas. Une idée pourquoi?
J'ai également envisagé d'utiliser QApplication :: setOverrideCursor; Cependant, cela provoque d'autres problèmes.
Des recommandations? Merci!
(J'utilise Qt 4.7 et de faire mon développement sur Windows 7 en utilisant Qt Creator avec le compilateur par défaut MinGW.)
est ici plus en détail.
dans le constructeur MainWindow: this->setCursor(Qt::CrossCursor);
rapport signal/connexions à sous:
QObject::connect(button, SIGNAL(clicked()), MainWindow, SLOT(showMessageBox()));
QObject::connect(action, SIGNAL(triggered()), MainWindow, SLOT(showMessageBox()));
fonction 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);
}
Lorsque showMessageBox
est appelé avec 'bouton', le curseur d'attente est affiché sous la forme attendu.
Lorsque showMessageBox
est invoqué via 'action', le curseur d'attente n'apparaît pas; à la place, le curseur passe de Qt :: CrossCursor à un Qt :: ArrowCursor dès que l'utilisateur sélectionne l'élément de menu 'action', puis passe à Qt :: PointingHandCursor une fois que la boîte de message s'ouvre. Le curseur d'attente n'apparaît jamais.
Quels sont les problèmes à l'aide setOverrideCursor? – Exa
Oh, et pourriez-vous poster un peu plus de code? Peut-être que le problème se produit déjà dans la macro de connexion. – Exa
J'ai développé mon post pour inclure un exemple de code qui reproduit le comportement. L'inconvénient que j'ai trouvé avec setOverrideCursor est que si vous avez besoin d'afficher une boîte de message à un moment donné dans une fonction qui affiche un curseur d'attente, vous devez temporairement supprimer le curseur d'attente (avec restoreOverrideCursor); sinon, le curseur d'attente apparaîtra également dans la boîte de dialogue. En outre, j'ai trouvé que vous devriez également faire la même chose lors de l'affichage d'une boîte de dialogue générée par Qt (QFileDialog :: getOpenFileName) pour éviter le scintillement. –