我试图读取我在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调试器。
答案 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)。
答案 1 :(得分:0)
德米特里的评论(上图)有一个适合我的答案:
this->window()->winId()
返回非null uint64。
谢谢,德米特里!