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

Force QMainWindow to fit exact size of shown Text

我尝试构建一个无框架的 window,带有单个文本标签,文本标签根据所选语言及其周围的边界不断变化。此 window 应始终具有尽可能小的尺寸。这是到目前为止我尝试过的没有任何配置的简单代码。

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();

这显示了 window,但它没有应有的那么小,还剩下很多 space。

使用 setMinimumSize(0,0) 没有帮助。 我想我理解使用 QSizePolicy 在一种布局中根据彼此调整小部件的大小,如 post layout mechanism 中所述。但它是一个 groupbox 中的单个小部件,不知道哪个小部件导致这个 window 的尺寸更大。 使用 setFixedSize(),我可以获得更小的尺寸,但我不知道如何设置正确的尺寸。 width() 标签的宽度不是显示文本的宽度。

任何人都可以解释我必须设置哪些配置才能获得我的简约 window?我确定我忽略了一些东西,但我被卡住了。

第一, You need to adjust the size of each widget to fit to its content.

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

需要自下而上才能按预期工作。首先是最低级别的小部件,然后是它的 parent,依此类推,直到顶级小部件。它应该适用于默认大小策略和大小限制。

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

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

其次,你不需要QMainwindow作为顶级parent,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();
}

小部件:

Window(只需更改 top_widget 的类型并使用 Qt::Window):