2016-09-27 2 views
0

Я пытаюсь прочитать HWND диалога, который я подклассифицировал из QDialog, но я (думаю, что я) запущен в Memory Access Error, что приводит к возврату нулевого указателя в клиентский код.Как получить HWND для QDialog в Windows 10

Заголовочный файл - Я отказался пытается получить HWND как я не могу даже получить WID ...

#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. Надеюсь, что-то очевидное, что мне не хватает.

Что такое канонический способ получения WID QDialog?

Toolchain: Windows 10 Anniversary, Qt 5.7, оба 64-разрядных, Visual Studio 14 C++-компилятор, отладчик Windows SDK.

+0

Попробуйте 'this-> window() -> winId()' –

+0

** Для чего вам нужен HWND? ** Почему вы предполагаете, что есть HWND для начала? Современный пользовательский интерфейс не будет использовать собственные окна для создания интерфейса. 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 Установите атрибут Qt :: WA_PaintOnScreen, чтобы обеспечить собственное окно (это подразумевает 3).

См СПОКОЙНОЙ ДОКУМЕНТАЦИИ http://doc.qt.io/qt-4.8/qwidget.html#effectiveWinId

+2

1. Не надо. 2. Не делайте этого. 3. Да. 4. Да, но опасно. 5. Не требуется. –

+0

Спасибо, Дмитрий, ты сделал это очень ясно. – Naidu

+0

Около 1, 2. Такой подход будет работать, но это вызовет проблемы с производительностью. –

0

комментарий Дмитрия (выше) имеет работу-для-меня ответить:

this->window()->winId() 

возвращает ненулевое UInt64.

Спасибо, Дмитрий!

Смежные вопросы