Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt C++;窗口标题栏被阻止_C++_Qt - Fatal编程技术网

C++ Qt C++;窗口标题栏被阻止

C++ Qt C++;窗口标题栏被阻止,c++,qt,C++,Qt,我对Qt非常陌生,正在尝试创建应用程序,包括主窗口、QDockWidget和一个按钮 假设我的主窗口具有1280 x 720分辨率。然后我想实现从左侧弹出的QDockWidget,宽度为dockWidth,高度为720,没有windowTitleBar。该按钮的大小为(buttonWidth,720)。起初它是隐藏的,只有按钮是存在的,当我们点击按钮坞弹出,按钮的位置改变到坞的右边缘。 这是我的密码: window::window(unsigned int h, unsigned int v,

我对Qt非常陌生,正在尝试创建应用程序,包括主窗口、QDockWidget和一个按钮

假设我的主窗口具有1280 x 720分辨率。然后我想实现从左侧弹出的QDockWidget,宽度为dockWidth,高度为720,没有windowTitleBar。该按钮的大小为(buttonWidth,720)。起初它是隐藏的,只有按钮是存在的,当我们点击按钮坞弹出,按钮的位置改变到坞的右边缘。 这是我的密码:

window::window(unsigned int h, unsigned int v, QWidget *parent) {
    this->setFixedSize(h, v);
    ui.setupUi(this);
    createDockWindow();
}
void window::createDockWindow() {
    dock = new QDockWidget(this);
    dock->setTitleBarWidget(new QMainWindow());
    dock->setGeometry(QRect(this->rect().topLeft(),
                      QSize(dockWidth, this->height())));
    dock->setFloating(true);
    dock->hide();

    path_button = new QPushButton(">", this);
    path_button->setGeometry(QRect(this->rect().topLeft(),
                             QSize(buttonWidth, this->height())));
    connect(path_button, SIGNAL (released()), this, SLOT (showDock()));
}

void rubrick::showDock() {
    if(dock->isHidden()){
        dock->show();
        path_button->setGeometry(QRect(dock->rect().topRight(), 
                                 QSize(buttonWidth, this->height())));
    } else {
        dock->hide();
        path_button->setGeometry(QRect(dock->rect().topLeft(), 
                                 QSize(buttonWidth, this->height())));
    }   
}
所以按钮工作得很好,起初我的应用程序看起来像屏幕截图:

但当dock显示时,它会阻止应用程序窗口标题栏,如:屏幕截图

我想,这个->rect().topLeft()返回屏幕的左上角,但没有考虑窗口标题栏,我尝试获取菜单栏的高度,但它返回30,我发现如果我将左上角移动(0,45),0表示宽度,45表示高度,停靠将完全就位。
我做错了什么?如何解决这个问题

您可能正在寻找的方法是
QWidget::frameGeometry
,它返回包含框架的窗口的几何图形。
rect
方法只返回内部区域。如果您查看Qt助手中的
QWidget::rect
,您会发现一个指向“窗口几何体”描述的链接,该描述很好地解释了所有这些交互

它返回742,所以差值是22,但是如果我把dock向下移动22个像素,它就不会在标题栏下移动:(好的,这很有帮助,我需要添加差值*2+1才能到达下一个像素,因为QDockWidget和主窗口都有22个像素的差值。所以45是一个不错的选择,但是现在这对于任何分辨率都是可以计算的。谢谢