2016-09-27 3 views
0

私はQDialogからサブクラス化されたダイアログのHWNDを読み込もうとしていますが、NULLポインタが返されるMemory Access Errorに実行中ですクライアントコード。Windows 10でQDialogのHWNDを取得する方法

ヘッダファイル - 私は私もWIDを得ることができないとしてHWNDを取得しようとあきらめて...

#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 Dialog::getWindowHandle() { 
    WId id = this->effectiveWinId(); // debugger says id = 0 
    return id; 
} 

私も試してみましたこれは:

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

Qtを初めてお使いです。うまくいけば私は行方不明の何かが明らかです。

QDialogのWIdを取得する標準的な方法は何ですか?

ツールチェーン: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ご使用の環境に= 1 QT_USE_NATIVE_WINDOWSを使用してください。

2アプリケーションでQt :: AA_NativeWindows属性を設定します。すべての ウィジェットはネイティブウィジェットになります。

3セットのQt :: WA_NativeWindowウィジェットの属性:( Qtの:: WA_DontCreateNativeAncestorsが設定されていない限り)ウィジェット自体 とその祖先のすべてがネイティブとなります。

4 QWidget :: winIdを呼び出してネイティブウィンドウを実行します(これは3を意味します)。

5 Qt :: WA_PaintOnScreen属性をネイティブウィンドウ (これは3を意味します)を適用するように設定します。

は、(上記の)QTドキュメント http://doc.qt.io/qt-4.8/qwidget.html#effectiveWinId

+2

1.しないでください。 2.しないでください。 3.はい。はい、しかし危険です。 5.不要です。 –

+0

ドミトリーに感謝しました。 – Naidu

+0

約1,2です。このようなアプローチは機能しますが、パフォーマンスの問題が発生します。 –

0

ドミトリーさんのコメントを参照してください作品-用-meが答えています:

this->window()->winId() 

はnull以外のuint64型を返します。

ありがとう、ドミトリー!

関連する問題