2011-07-05 4 views
7

현재 Qt 프로그램을 작성 중입니다. 긴 작업이 실행되는 응용 프로그램과 상호 작용에서 사용자를 방지하기 위해, 나는 그러나 Qt - 커서를 모래 시계로 바꾸고 커서를 비활성화하십시오.

QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); 

를 호출하여 overriding the cursor을 시도, 마우스 클릭 이벤트는 사용할 수 없습니다.

GUI의 모든 위젯을 비활성화하지 않고 마우스 클릭 이벤트를 비활성화하는 방법이 있습니까?

답변

8

나는 을 찾기 위해 많은 시간을 보냈는데 실제로은 Qt에서 사용자 상호 작용을 방지하고 이벤트 필터링이 수용 가능한 해결책 인 것처럼 보입니다. 여기

예 : 당신은 무엇을 잠글 수있는 그런

class AppFilter : public QObject 
{ 
protected: 
    bool eventFilter(QObject *obj, QEvent *event); 
}; 

bool AppFilter::eventFilter(QObject *obj, QEvent *event) 
{ 
    switch (event->type()) 
    { 
    //list event you want to prevent here ... 
    case QEvent::KeyPress: 
    case QEvent::KeyRelease: 
    case QEvent::MouseButtonRelease: 
    case QEvent::MouseButtonPress: 
    case QEvent::MouseButtonDblClick: 
    //... 
    return true; 
    } 
    return QObject::eventFilter(obj, event); 
} 

:

qapp->setOverrideCursor(Qt::WaitCursor); 
qapp->installEventFilter(filter); 

그리고 잠금을 해제 :

while(qapp->overrideCursor()) //be careful application may have been lock several times ... 
    qapp->restoreOverrideCursor(); 
qapp->removeEventFilter(filter); 
0

setOverrideCursur는 커서 모양 만 변경합니다. 사용자 입력을 비활성화하려면 이벤트 루프에서 진행 대화 상자를 팝업하거나 마우스/키보드 이벤트를 필터링 할 수 있습니다.

0

내 응용 프로그램에 도움이되는 다른 접근 방식은 다음과 같습니다. 사용자 이벤트가 처리되는 동안 현재 실행중인 작업이 Q (Core) Application :: processEvents()를 호출 할 때만 새 마우스 클릭/버튼 누름이 처리됩니다. 이것은 재 페인트를 강요하기 위해 종종 사용됩니다. 진행률 막대가 변경 될 때 이것은 포함 된 Qt 기반 타사 라이브러리의 일부일 수도 있습니다.

당신은 작업이 완료된 후 처리됩니다 당신의 긴 작업 기간 동안 발생

QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); 

마우스 클릭으로 이러한 호출을 변경하는 경우. 물론 사용자 입력 이벤트를 지연시키지 않고 모든 단일 processEvents() 호출을 확인해야하는 경우가있을 수 있습니다.

타사 라이브러리에 processEvents() 호출이 있고 변경할 수없는 경우 두려운 것과 동일한 문제가 발생합니다.

+0

processEvents 당신이 Quit-를받을 특히, 까다로운 일이 될 수 있습니다 processEvents 내의 알림. 마우스 이벤트와 함께 키보드 이벤트도 필터링됩니다. 따라서 응용 프로그램을 닫을 수도 있습니다. – Jens

+0

더 긴 작업을 중단하는 것은 실제로 문제입니다. 원하는 경우 자체 이벤트 루프가 유일한 가능성 일 것입니다. –

관련 문제