2016-09-27 2 views
0

QDialog에서 하위 클래스 인 HWND를 읽으려고 시도하지만 NULL 포인터가 반환되는 Memory Access Error으로 실행 중입니다. 클라이언트 코드Windows 10에서 QDialog에 대해 HWND를 얻는 방법

WId Dialog::getWindowHandle() { 
    WId id = this->effectiveWinId(); // debugger says id = 0 
    return id; 
} 

나는 또한 시도했다 : -

헤더 파일은 내가

#ifndef DIALOG_H 
#define DIALOG_H 

#include <QDialog> 
#include <QGraphicsScene> 
#include <QGraphicsView> 
#include <QGraphicsItem> 

namespace Ui { 
class Dialog; 
} 

class Dialog : public QDialog 
{ 
    Q_OBJECT 

public: 
    explicit Dialog(QWidget *parent = 0); 
    ~Dialog(); 

    WId getWindowHandle (void); 
private: 
    Ui::Dialog *ui; 
    QGraphicsScene *scene; 
    QGraphicsTextItem *text; 
}; 

#endif // DIALOG_H 

는 구현 ... 나는 심지어 WID를 얻을 수없는 등의 HWND를 얻으려고 노력 포기했습니다 이 :

WId Dialog::getWindowHandle() { 
    QWidget *parent = this->nativeParentWidget(); // debugger says parent = 0 
    WId id = parent->effectiveWinId(); // so this crashes 
    return id; 
} 

Qt를 처음 사용했습니다. 바라기를 내가 놓치고있는 뭔가 분명하다.

QDialog의 정보를 가져 오는 표준 방법은 무엇입니까?

툴체인 : Windows 10 주년, Qt 5.7, 모두 64 비트, Visual Studio 14 C++ 컴파일러, Windows SDK 디버거.

+0

'this-> window() -> winId()'를 시도하십시오. –

+0

** HWND가 필요한 대상은 무엇입니까? ** 처음에는 HWND가 있다고 가정합니까? 현대적인 UI에서는 기본 창을 사용하여 인터페이스를 빌드하지 않습니다. Qt는 그것을하지 않으며, WPF는 그것을하지 않으며, GTK는하지 않습니다. –

답변

2

희망이 도움이 될 것입니다.

Qt 4.4에서 소개 된 외계 위젯은 윈도우 시스템에서 알 수없는 위젯입니다. 그들은 그들과 관련된 네이티브 창 핸들을 갖고 있지 않습니다. 이 기능은 위젯 페인팅 속도를 크게 높이고 크기를 조정하며 깜박임을 제거합니다.

당신은 기본 윈도우와 이전 동작이 필요한 경우, 다음 옵션 중 하나를 선택할 수 있습니다

1

를 사용하여 사용자 환경에서 QT_USE_NATIVE_WINDOWS = 1.

2 응용 프로그램에 Qt :: AA_NativeWindows 특성을 설정하십시오. 모든 위젯은 기본 위젯입니다.

3 세트 Qt의 :: WA_NativeWindow 위젯에 대한 속성 ( Qt는 :: WA_DontCreateNativeAncestors이 설정되어 있지 않으면) 위젯 자체 및 조상의 모든 기본이 될 것입니다.

4 QWidget :: winId를 호출하여 기본 창을 적용합니다 (3을 의미).

5 네이티브 창 (3을 의미)을 적용하도록 Qt :: WA_PaintOnScreen 특성을 설정하십시오.

는 QT 문서를 http://doc.qt.io/qt-4.8/qwidget.html#effectiveWinId

+2

1.하지 마십시오. 2.하지 마십시오. 3. 예. 4. 예,하지만 위험합니다. 5. 필요하지 않습니다. –

+0

감사 드미트리 (Dmitry) 감사합니다. – Naidu

+0

약 1, 2입니다. 이러한 접근 방식은 효과가 있지만 성능 문제를 일으킬 수 있습니다. –

0

드미트리의 코멘트 (위)가 참조 작품-FOR-내가 대답 :

this->window()->winId() 

가 null 이외의 UINT64를 반환합니다.

감사합니다. Dmitry!

관련 문제