【问题标题】:Force QMainWindow to fit exact size of shown Text强制 QMainWindow 适合显示文本的确切大小
【发布时间】:2015-04-13 00:06:43
【问题描述】:

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

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 中所述。但它是组框中的单个小部件,不知道哪个小部件会导致该窗口的尺寸变大。 使用setFixedSize(),我可以获得更小的尺寸,但我不知道设置正确尺寸的方法。标签的width() 不是显示文本的宽度。

谁能解释我必须设置哪些配置才能获得我的简约窗口?我确定我忽略了一些东西,但我被卡住了。

【问题讨论】:

    标签: qt size qwidget qmainwindow


    【解决方案1】:

    首先, 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):

    【讨论】:

    • 谢谢,对我来说很好用!你对育儿的看法也是对的。但这引出了另一个问题。您没有将父级设置为 QLabel()。我认为这是因为 Qt 自动将父级设置为addWidget()setLayout() 不一样吗?我在以下线程 link 中读到了这一点
    • 是的。所以你不应该打扰labelClientID 是否有一个父集。它与布局不同。 mainLayout = new QHBoxLayout(clientIDDisplay); 表示 mainLayout 是 clientIDDisplay 上的布局。因此mainWidget->setLayout(mainLayout); 将失败,并在标准输出上显示一条消息并且看起来不正确。当我知道小部件将被添加到布局或将设置布局时,我不会使用父级创建它们。这只是众多选择中的一种。但我尽量保持一致。
    猜你喜欢
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多