Qt 2 QMainWindow胶合-布局尺寸

Qt 2 QMainWindow胶合-布局尺寸,qt,qwidget,qmainwindow,Qt,Qwidget,Qmainwindow,我在main.cpp中有一个主窗口,以这种方式居中: int main(int argc, char *argv[]) { QApplication app(argc, argv); QMainWindow *qmain = new QMainWindow; Ui_MainWindow ui; ui.setupUi(qmain); QRect r = qmain->geometry(); r.moveCenter(QApp

我在main.cpp中有一个主窗口,以这种方式居中:

int main(int argc, char *argv[])
{    
     QApplication app(argc, argv);
     QMainWindow *qmain = new QMainWindow;
     Ui_MainWindow ui;
     ui.setupUi(qmain);
     QRect r = qmain->geometry();
     r.moveCenter(QApplication::desktop()->availableGeometry().center());
     qmain->setGeometry(r); 
     qmain->show();
     return app.exec();
}
在这个“qmain”主窗口中,我可以创建另一个qmain窗口,并尝试将这两个窗口粘在一起(我不知道怎么说)。实际上,我希望第一个的右上角位于第二个的左上角。为此,我使用以下Ui_MainWindow的成员函数:

void Ui_MainWindow::generate_IC()
{
qmenu = new QMainWindow;
DiskMenu = new Ui_DiskGalMenu;
DiskMenu->setupUi(qmenu);
setInitialDiskMenuPosition(qmenu, this);
qmenu->show();
}
和setInitialDiskMenuPosition:

void Ui_MainWindow::setInitialDiskMenuPosition(QMainWindow *MainWindow, Ui_MainWindow *parent)
{
        QSize size = parent->widget->size();
        QDesktopWidget* desktop = QApplication::desktop();
        int width = desktop->width();
        int height = desktop->height();
        int mw = size.width();
        int mh = size.height();
        int right = (width/2) + (mw/2);
        int top = (height/2) - (mh/2);
       MainWindow->move(right, top);
}
但问题是我没有得到我想要的东西,因为centralwidget size“parent->widget->size()”只返回小部件的大小,而不是整个“qmain”父窗口。因此,我有一个轻微的偏移,因为“qmain”窗口的边界未被考虑,如下所示:

如果我可以访问整个父窗口的大小


如果有人可以帮助我,根据文档,您需要使用父->小部件->框架几何体().size()而不是父->小部件->大小()

即使使用父->小部件->框架几何体().size(),这也不起作用。我在Debian GNU/Linux上。来自文档:“X11没有提供任何标准或简单的方法来在窗口装饰后获取框架几何体。Qt通过巧妙的启发式方法和聪明的代码解决了这个问题,这些方法适用于目前存在的各种各样的窗口管理器。如果您在QWidget::frameGeometry()中找到这样一种方法,请不要感到惊讶但返回错误的结果。”