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