使QDialog窗口适合文本大小

时间:2019-01-16 20:35:42

标签: qt qdialog

我有一个使用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的窗口。我希望它适合测试。

1 个答案:

答案 0 :(得分:0)

一种方法是使用“字体度量”来获取每个标签的边界矩形,然后将窗口大小设置为两个矩形的总和加上一些填充以使其看起来不错。

您将遇到的一个问题是自动换行。如果您正在自动换行,如何确定窗口的宽度?因此,我为窗口添加了“ 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);

}