如何在Windows 10中为QDialog获取HWND

时间:2016-09-27 21:53:05

标签: c++ windows qt

我试图读取我在QDialog中分类的对话框的HWND,但是我(我想)我遇到了Memory Access Error,导致空指针返回到客户端代码。

头文件 - 我已经放弃尝试获得HWND,因为我甚至无法获得一个WI ... ...

#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的规范方法是什么?

工具链:Windows 10 Anniversary,Qt 5.7,64位,Visual Studio 14 C ++编译器,Windows SDK调试器。

2 个答案:

答案 0 :(得分: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)。

参考QT文档 http://doc.qt.io/qt-4.8/qwidget.html#effectiveWinId

答案 1 :(得分:0)

德米特里的评论(上图)有一个适合我的答案:

this->window()->winId()

返回非null uint64。

谢谢,德米特里!