Как я могу изменить размер 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 "вручную"? Благодарю.

2 ответа

Решение

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

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

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

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

Вдохновленный подходом "проверить исходный код 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.

Другие вопросы по тегам