如何从QFrame子类中获取所属MainWindow的winId?
获取Test部件所属MainWindow的winId的替代方法
除了你用的遍历父部件的方式,Qt提供了更简洁可靠的原生方法来获取部件所属的顶级窗口(也就是你说的MainWindow):
方法一:使用QWidget::window()函数
window()函数会直接返回包含当前部件的最顶层窗口,无需手动遍历父部件链,代码示例:
class Test: public QFrame { Q_OBJECT public: Test(QWidget* parent = 0) : QFrame(parent) { QWidget* topLevelWindow = this->window(); if (topLevelWindow) { HWND winHandle = (HWND)topLevelWindow->winId(); // 这里可以使用获取到的窗口句柄 } } };
注:window()会自动处理所有父部件层级,无论中间嵌套多少层,都能准确找到最顶层的窗口对象,比手动遍历更不易出错。
方法二:直接转换为QMainWindow类型(明确场景下使用)
如果你确定当前部件所属的顶级窗口一定是QMainWindow,可以结合window()和qobject_cast直接获取具体的MainWindow指针,类型更明确:
#include <QMainWindow> class Test: public QFrame { Q_OBJECT public: Test(QWidget* parent = 0) : QFrame(parent) { QMainWindow* mainWindow = qobject_cast<QMainWindow*>(this->window()); if (mainWindow) { HWND winHandle = (HWND)mainWindow->winId(); // 使用窗口句柄 } } };
注:这个方法需要确保当前部件确实处于QMainWindow的层级中,否则qobject_cast会返回NULL,使用前记得做非空判断。
内容的提问来源于stack exchange,提问作者Cesar
相关产品推荐
相关产品推荐

