2011-02-28 5 views
2

내 MainWindow에는 신호가 모두 동일한 슬롯에 연결된 푸시 버튼과 메뉴 막대 항목이 있습니다. 슬롯 함수에서 나는 다음과 같이 쓴다 :Qt 메인 윈도우에서 커서를 메뉴 동작에서 변경할 수 없습니다.

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

이것은 슬롯 기능이 버튼을 통해 호출 될 때 예상대로 작동한다. 그러나 메뉴에서 동일한 기능이 호출되면 대기 커서가 나타나지 않습니다. 왜 그런가?

QApplication :: setOverrideCursor; 그러나 다른 문제가 발생합니다.

어떤 권장 사항이 있습니까? 감사!

(I Qt는 4.7을 사용하고 기본는 MinGW 컴파일러 Qt는 창조주를 사용하여 Windows 7에 내 개발을하고있는 중이 야.)

여기 자세한 내용입니다. 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가 버튼 '호출하면, 대기 커서가 표시된다 MainWindow를 생성자

예상했다.

'action'을 통해 showMessageBox을 호출하면 대기 커서가 나타나지 않습니다. 대신 사용자가 'action'메뉴 항목을 선택하자 마자 커서가 Qt :: CrossCursor에서 Qt :: ArrowCursor로 바뀌고 메시지 상자가 열리면 Qt :: PointingHandCursor로 바뀝니다. 대기 커서가 나타나지 않습니다.

+0

setOverrideCursor를 사용하여 문제가 무엇입니까? – Exa

+0

오, 더 많은 코드를 게시 할 수 있습니까? 어쩌면 문제는 이미 연결 매크로에서 발생하고 있습니다. – Exa

+0

동작을 재생산하는 몇 가지 샘플 코드가 포함되도록 게시물을 확장했습니다. setOverrideCursor를 사용하여 발견 된 불편은 대기 커서를 표시하는 함수에서 메시지 상자를 표시해야하는 경우 waitOscideCursor와 함께 대기 커서를 일시적으로 제거해야한다는 것입니다. 그렇지 않으면 대기 커서가 대화 상자에도 나타납니다. 또한 약간의 깜박임을 피하기 위해 Qt 생성 대화 상자 (QFileDialog :: getOpenFileName)를 표시 할 때도 동일한 작업을 수행해야합니다. –

답변

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); 
} 
관련 문제