如何调整QMessageBox的大小?

26

我有一个QMessageBox,我希望它更大。它是一个简单的QMessageBox,有两个标准按钮,确定和取消。问题是对于我的应用程序目的来说它太小了。代码显示如下:

QMessageBox msg;
msg.setText("Whatever");
msg.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
msg.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

int ret = msg.exec();
switch (ret) {
  case QMessageBox::Ok:
      ui->textEdit->clear();
      break;
  case QMessageBox::Cancel:
      break;}

我尝试了几种方法来增加大小:

msg.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

msg.setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum);

msg.setFixedHeight(600);
msg.setFixedWidth(600);

我已经尝试了清除和重建,编译没有报错但是没有任何效果...

你知道如何手动设置QMessageBox的大小吗?谢谢。

5个回答

49

您可以编辑标签的 CSS:

msg.setStyleSheet("QLabel{min-width: 700px;}");

您可以类似地编辑按钮的CSS,添加边距或使它们变大。

例如:

msg.setStyleSheet("QLabel{min-width:500 px; font-size: 24px;} QPushButton{ width:250px; font-size: 18px; }");

还提到了一个小技巧:

QSpacerItem* horizontalSpacer = new QSpacerItem(800, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
QGridLayout* layout = (QGridLayout*)msg.layout();
layout->addItem(horizontalSpacer, layout->rowCount(), 0, 1, layout->columnCount());

但是这似乎并不适用于每个人。


1
是的,那就是解决方案。但现在按钮和文本显示不成比例。我该如何增加它们以保持比例? - DYangu
它与高度配合得更好 msg.setStyleSheet("QLabel{height: 300px; min-height: 300px; max-height: 300px;}"); - DYangu
1
@DYangu编辑了另一个CSS示例,以更改按钮的大小。您可以玩弄CSS,但如果没有明确的结果,我无法提供更具体的建议。 - coyotte508
@DYangu,请查看我的答案,其中可能有另一种解决方案可以修复这个问题。 - Spencer

10

coyotte508的回答导致我的布局严重偏离中心,并且在不同的宽度下被裁剪。在进一步搜索时,我找到了这个线程,其中解释了更好的解决方案。

实际上,消息框的布局是一个网格,因此您可以向其添加SpacerItem来控制宽度。以下是来自该链接的c++代码示例:

QMessageBox msgBox;
QSpacerItem* horizontalSpacer = new QSpacerItem(500, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
msgBox.setText( "SomText" );
QGridLayout* layout = (QGridLayout*)msgBox.layout();
layout->addItem(horizontalSpacer, layout->rowCount(), 0, 1, layout->columnCount());
msgBox.exec();

1

我希望我的QMessageBox的宽度能够根据文本内容的长度成比例地适应,同时还有一定的缓冲区以避免换行。在查阅了许多论坛和线程(包括这个)之后,我想到了以下解决方案:

int x_offset = (2.0 * MainWindow::geometry().x());
int y_offset = (0.5 * MainWindow::geometry().y());
msgBox.setText(vers_msg.data());
QSpacerItem* horizontalSpacer = new QSpacerItem 
    (8 * vers_msg.size(), 0,
    QSizePolicy::Minimum, QSizePolicy::Expanding);
QGridLayout* layout = (QGridLayout*)msgBox.layout();
layout->addItem(horizontalSpacer, layout->rowCount(),
    0, 1, layout->columnCount());
msgBox.setGeometry(
    MainWindow::geometry().x() + x_offset,
    MainWindow::geometry().y() + y_offset,
    msgBox.geometry().width(),
    msgBox.geometry().height());

调整x_offset、y_offset和horizontalSpacer中的硬数字以适应您的情况。我希望这会比现在更容易,但至少这个方法可行。


1

受“查看Qt源代码并进行适应”的方法启发,我在Qt 5.12中采用了这种方法:

if (auto grid = dynamic_cast<QGridLayout*>(msgBox.layout())) {
    if (auto text = grid->itemAtPosition(0, grid->columnCount() - 1); text && text->widget()) {
        text->widget()->setFixedWidth(500);
    }
}

请记住,如果他们改变了QMessageBox的布局方式,这个方法就会失效。

1
您可以子类化QMessageBox并重新实现resize事件处理程序,如下所示:
void MyMessageBox::resizeEvent(QResizeEvent *Event)
{
    QMessageBox::resizeEvent(Event);
    this->setFixedWidth(myFixedWidth);
    this->setFixedHeight(myFixedHeight);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接