使 QDialog window 适合文本大小

Fit QDialog window to size of text

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

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

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

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

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

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

您将 运行 遇到的一个问题是启用自动换行。 window如果是自动换行怎么确定宽度呢?所以我为 window 添加了一个 "MAXWIDTH"。如果您的文本较短且不需要自动换行 - window 将缩小以适合它。如果确实需要自动换行,则不会超过您设置的大小。

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

}