Как изменить размер 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 "вручную"? Спасибо.

Ответ 1

Вы можете отредактировать 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());

Но это не работает для всех.

Ответ 2

Ответ 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();

Ответ 3

Вы можете QMessageBox подкласс QMessageBox и переопределить обработчик события изменения размера следующим образом:

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

Ответ 4

Я хотел, чтобы ширина моего 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 в соответствии с вашей ситуацией. Я надеялся, что это будет легче, чем это, но по крайней мере это работает.