2011-02-28 5 views
2

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.

+0

Quels sont les problèmes à l'aide setOverrideCursor? – Exa

+0

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

+0

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. –

Répondre

0

Votre code est synchrone et utilise une boucle de retard. Lorsque vous êtes dans la boucle de délai, aucun code Qt ne peut être exécuté. Un changement de curseur nécessite que la boucle d'événement tourne - de sorte qu'il apparaît à partir des symptômes que vous donnez.

Voici comment le faire correctement - rappelez-vous, si vous utilisez des retards/dortoirs et d'autres appels de blocage dans votre code GUI, vos utilisateurs vous détesteront, à juste titre. L'utilisation de exec() dans les boîtes de dialogue/message est également un mauvais style. Votre application est asynchrone, codez-la. Assurez-vous que vos emplacements sont déclarés comme tels (dans la section slots protégés: de la déclaration 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); 
} 
Questions connexes