我尝试构建一个带有单个文本标签的无框窗口,根据所选语言和周围的边框改变文本。此窗口应始终具有尽可能小的尺寸。这是我迄今为止尝试的没有任何配置的简单代码。
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()
不是所示文字的宽度。
任何人都可以解释我必须设置哪些配置才能获得我的简约窗口?我确定我忽视了一些事情,但我被困住了。
答案 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();
}
窗口小部件:
窗口(只更改top_widget
的类型并使用Qt::Window
):