2014-07-25 2 views
0

나는 테이블, 버튼 등이있는 mainwindow.ui가있는 QMainWindow가 하나뿐입니다. 하나의 버튼에서 위젯을 동적으로 만들고 evenFilter를 설정하고 싶습니다. 내가 프로그램을 컴파일 할 때동적으로 생성 된 QWidget에 eventFilter를 설치하는 방법은 무엇입니까?

QWidget dialog = new QWidget(); 
dialog->installEventFilter(this); 

그것은 QObject::installEventFilter(): Cannot filter events for objects in a different thread.

이 어떻게 다른 Qobjects과 글에이 위젯을 추가하거나이 문제에 대한 최선의 해결책은 무엇인가 있다고?

+2

QWidget이 특정 QThread (기본이 아닌)에 속합니까? – duDE

+0

QWidget was not가 나에 의해 다른 스레드를 설정했습니다. 그것은 mainwindow.cpp에서 만든 것이지, 다른 객체처럼 UI에있는 디자이너가 아닙니다 .-> tableView ..etc –

+0

다른 스레드에 다른 QObject가 있습니까? 모든 위젯은 주 스레드에 있어야합니다. QObject :: moveToThread를 사용하여 특정 QObject의 스레드를 설정할 수 있습니다 (주 스레드는 QApplication :: instance() -> thread()에 의해 수신 될 수 있지만 모든 너의 위젯은 UI 스레드에서 직접. – nikitoz

답변

0

비 GUI 스레드에서 GUI 위젯을 생성하지 마십시오.

QWidget의 하위 클래스를 만들고 거기에 eventFilter를 설치하고 신호를 넣어 결과를 반환하십시오.

스레드에서 메인 스레드 슬롯으로 신호를 보내고 이것을 QWidget dialog = new MyWidget()으로 만들고 원하는대로 사용하십시오.

+0

이 블로그에 대해 나에게 줄 수 있습니까? 나는 왜 그렇게 단순한 것이 복잡한 지 이해하지 못한다. –

+0

나는 답이있는 블로그를 모른다. 그러나 위젯, 다른 스레드의 객체를 직접 액세스 할 수 없다는 것을 기억하십시오. 유일한 방법은 신호 슬롯을 사용하는 것입니다. – IGHOR