如何调整QMessageBox的大小?

时间:2016-06-07 00:38:07

标签: c++ qt qmessagebox

我有QMessageBox,我希望它更大。它是一个简单的QMessageBox,有两个标准按钮,Ok和Cancel。问题在于它对于我的应用程序而言非常小。代码显示如下:

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 个答案:

答案 0 :(得分:21)

您可以编辑标签的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());

但这似乎并不适合所有人。

答案 1 :(得分:1)

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

本质上,消息框的布局是一个网格,因此您可以向其添加一个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();

答案 2 :(得分:0)

您可以继承.htaccess并重新实现大小调整事件处理程序,如下所示:

QMessageBox

答案 3 :(得分:0)

我希望我的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中的硬数字以适合您的情况。我希望这会比这容易,但至少能奏效。

答案 4 :(得分:0)

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