2017-02-21 121 views
0

我对Qt很陌生,试图创建包括主窗口,QDockWidget和一个按钮的应用程序。Qt C++窗口标题栏被阻止

假设我的主窗口有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()))); 
    } 
} 

所以按键完美的作品,起初我的应用程序看起来像截图:

但当坞显示,它会阻止应用程序窗口标题栏,像的是:截图

我计算,这 - >矩形()左上()返回顶部LEF但是没有考虑窗口标题栏,我试图获取menuBar高度,但它返回30,并且我发现如果我将左上移动(0,45),其中0为宽度,45为高度,码头将完美到位。 我在做什么错,以及如何解决这个问题?

回答

0

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

+0

那么它返回742,所以差异是22,但如果我移动码头22像素下来,它不会移动下标题栏:( – fminkin

+0

好吧,它帮助,我需要添加差异* 2 + 1以达到下一个像素,因为QDockWidget和主窗口之间有22个像素的差异,所以45是一个很好的选择,但是现在可以计算任何分辨率。 – fminkin