强制QMainWindow适合所显示文本的确切大小

时间:2015-02-12 09:56:07

标签: qt size qwidget qmainwindow

我尝试构建一个带有单个文本标签的无框窗口,根据所选语言和周围的边框改变文本。此窗口应始终具有尽可能小的尺寸。这是我迄今为止尝试的没有任何配置的简单代码。

QMainWindow* clientIDDisplay = new QMainWindow(0, Qt::Window 
                                                | Qt::FramelessWindowHint 
                                                | Qt::WindowStaysOnTopHint);

QGroupBox* mainWidget = new QGroupBox(clientIDDisplay); 
mainWidget->setStyleSheet(stylesheetGroupBox);

QLabel* labelClientID = new QLabel(clientIDDisplay);    
labelClientID->setStyleSheet(stylesheetLabel);
labelClientID->setText("Client");

QHBoxLayout* mainLayout = new QHBoxLayout(clientIDDisplay);
mainLayout->addWidget(labelClientID);
mainWidget->setLayout(mainLayout);

clientIDDisplay->setCentralWidget(mainWidget);

clientIDDisplay->show();

这显示了窗口,但它没有它应该的那么小,还剩下很多空间。

使用setMinimumSize(0,0)无济于事。 我想我理解使用QSizePolicy在一个布局中根据彼此调整窗口小部件的大小,如本文layout mechanism中所述。但它是组合框中的单个小部件,不知道whitch小部件会导致此窗口的大小更大。 使用setFixedSize(),我可以获得更小的尺寸,但我不知道如何设置正确的尺寸。标签的width()不是所示文字的宽度。

任何人都可以解释我必须设置哪些配置才能获得我的简约窗口?我确定我忽视了一些事情,但我被困住了。

1 个答案:

答案 0 :(得分:0)

首先, You need to adjust the size of each widget to fit to its content

labelClientID->adjustSize();
mainWidget->adjustSize();
clientIDDisplay->adjustSize();

需要 自下而上 才能按预期工作。首先是最低级别的小部件,然后是其父级等等。直到顶级小部件。它应该与默认大小策略和大小约束一起使用。

在您的情况下,请在clientIDDisplay->show();之前执行此操作,以防止屏幕上出现闪烁。

在您的代码中,您使用 错误的 父级创建布局和小部件。解决这个问题。

其次,您不需要QMainwindow作为顶级父级,QWidget会提供更好的结果。

亲自试试:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget* top_widget = new QWidget(0, Qt::Widget | Qt::FramelessWindowHint
                                      | Qt::WindowStaysOnTopHint);

    QGroupBox* mainWidget = new QGroupBox(top_widget);

    QLabel* labelClientID = new QLabel();
    labelClientID->setText("Client");

    QHBoxLayout* mainLayout = new QHBoxLayout(mainWidget);
    mainLayout->addWidget(labelClientID);
    mainWidget->setLayout(mainLayout);


    labelClientID->adjustSize();
    mainWidget->adjustSize();
    top_widget->adjustSize();

    top_widget->show();


    return a.exec();
}

窗口小部件:
enter image description here
窗口(只更改top_widget的类型并使用Qt::Window):
enter image description here