如何调整 QMessageBox 的大小?

How can I resize QMessageBox?

我有一个 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 大小吗"by hand"?谢谢

您可以编辑标签的css:

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

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

例如:

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

还有一个trick mentioned:

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

但这似乎并不适用于所有人。

coyotte508 的回答导致我的布局严重偏离中心并且在不同的宽度上被切断。在进一步搜索中,我发现 this 线程解释了一个更好的解决方案。

messagebox的布局本质上是一个网格,所以你可以在其中添加一个SpacerItem来控制宽度。这是 link:

中的 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();

您可以子类化 QMessageBox 并重新实现调整大小事件处理程序,如下所示:

void MyMessageBox::resizeEvent(QResizeEvent *Event)
{
    QMessageBox::resizeEvent(Event);
    this->setFixedWidth(myFixedWidth);
    this->setFixedHeight(myFixedHeight);
}

我希望我的 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 和 horizo​​ntalSpacer 中的硬数字以适合您的情况。我希望它会比这更容易,但至少这是有效的。

受“检查 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 布局的方式,这将会中断。