如何调整 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 和 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 布局的方式,这将会中断。
我有一个 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 和 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 布局的方式,这将会中断。