【问题标题】:Fit QDialog window to size of text使 QDialog 窗口适合文本大小
【发布时间】:2019-01-16 20:35:41
【问题描述】:

我有一个接收 QString 的 QDialog 类。我正在使用设置的宽度和高度调用 setFixedSize,但我希望 QDialog 更具动态性并适合文本的大小。

我尝试过 adjustSize(),但所做的只是将窗口缩小到文本被截断的位置。

ConfirmDialog::ConfirmDialog(const QString& message, QWidget* parent)
: QDialog(parent)
{
    setFixedSize(WIDTH, HEIGHT);

    statusLabel->setText(tr("Confirmation"));
    statusDetailsLabel->setText(message);
    statusDetailsLabel->setWordWrap(true);
}

我总是看到尺寸为 WIDTH 和 HEIGHT 的窗口。我希望它适合测试。

【问题讨论】:

    标签: qt qdialog


    【解决方案1】:

    一种方法是使用 Font Metrics 来获取每个标签的边界矩形,然后将窗口大小设置为两个矩形的总和 + 一些填充以使其看起来不错。

    您会遇到的一个问题是使用自动换行。如果你是自动换行,你如何确定窗口的宽度?所以我为窗口添加了一个“MAXWIDTH”。如果您的文本较短并且不需要自动换行 - 窗口将缩小以适应它。如果确实需要自动换行,则不会超出您设置的大小。

    ConfirmDialog::ConfirmDialog(const QString& message, QWidget* parent)
    : QDialog(parent)
    {
        const int MAXWIDTH = 400;
        const int VERTICALPADDING = 50;
    
        // Create Layout
        QLabel *statusLabel = new QLabel(this);
        QLabel *statusDetailsLabel = new QLabel(this);
        QVBoxLayout *layout = new QVBoxLayout();
        layout->addWidget(statusLabel);
        layout->addWidget(statusDetailsLabel);
        setLayout(layout);
    
        // Populate Text
        statusLabel->setText(tr("Confirmation"));
        statusDetailsLabel->setText(message);
        statusDetailsLabel->setWordWrap(false); // Start w/ word wrap off.
    
        // Font metrics to get the sizes of our text.
        QFontMetrics fontMetricsLabel(statusLabel->font());
        QFontMetrics fontMetricsDetail(statusDetailsLabel->font());
    
        // Get max width - label or detail lable, whichever is longer.
        int width = std::max(fontMetricsLabel.boundingRect("Confirmation").width(),
                             fontMetricsDetail.boundingRect(message).width());
    
        // Check that we do not go over our MAXWIDTH.
        if(width > MAXWIDTH) width = MAXWIDTH;
    
        // Enable word wrapping.
        statusDetailsLabel->setWordWrap(true);
    
        // Get the heigts of both boxes.
        int height = std::max(fontMetricsLabel.boundingRect("Confirmation").height(),
                             fontMetricsDetail.boundingRect(message).height());
    
        // Set window size.
        this->setFixedSize(width, height + VERTICALPADDING);
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多