根据文本大小调整Q对话框窗口



我有一个接受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);
}

我总是看到一个尺寸为"宽度"one_answers"高度"的窗户。我希望它能通过测试。

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

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

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

最新更新