0

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

4

1 回答 1

0

一种方法是使用 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);

}
于 2019-01-16T23:31:01.987 回答