如何使QMessageBox按钮根据翻译文本自适应大小?

3

我目前正在进行应用程序的本地化工作。一切都按照我的预期进行翻译,但是QMessageBox没有调整按钮大小以适应文本。

English Buttons French Buttons

这是我用来生成问题框的代码,QTranslator被包装在定义了MM_TR的地方:

    #include <QMessageBox>

    void MainWindow::closeEvent( QCloseEvent * pEvent ) {
        QMessageBox::StandardButtons    iButtons        = QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel;
        QMessageBox::StandardButton     iDefaultButton  = QMessageBox::Save;
        QMessageBox::StandardButton     iButton         = QMessageBox::question( this, QString::fromStdString( MM_TR( "ctxMessageBoxQuestion", "Save changes?" ) ), QString::fromStdString( MM_TR( "ctxMessageBoxQuestion", "Project has been modified, save changes?" ) ), iButtons, iDefaultButton );
    }

我在互联网上搜索了一下是否有人遇到过同样的问题,但目前还没有找到任何确定性的东西。我尝试将大小策略设置为MinimumMinimumExpanding,但也不起作用。唯一有点作用的是设置样式表,我尝试使用以下代码:
        QMessageBox::StandardButtons    iButtons        = QMessageBox::Save | QMessageBox::Abort | QMessageBox::Cancel;
        QMessageBox msgClose( QMessageBox::Question, "Test", "Test button translation resizing.", iButtons );
        msgClose.setStyleSheet( "QPushButton {min-width:100;}" );

我认为手动根据出现的任何语言设置最小宽度不是正确的做法,因此我不想这样做。这也会更改所有推送按钮的宽度,这并不完全是我想要的。

我在想,现在唯一的选择是创建一个自定义对话框框?

更新: 我的最终解决方案包括cbuchart的答案以及样式表填充设置:

    QMessageBox::StandardButtons    iButtons        = QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel;
    QMessageBox msgClose( QMessageBox::Question, QString::fromStdString( MM_TR( "ctxMessageBoxQuestion", "Save changes?" ) ), QString::fromStdString( MM_TR( "ctxMessageBoxQuestion", "Project has been modified, save changes?" ) ), iButtons );
    msgClose.setStyleSheet( "QPushButton {padding: 3px;}" );
    msgClose.layout()->setSizeConstraint( QLayout::SizeConstraint::SetMinimumSize );
    QMessageBox::StandardButton     iButton = (QMessageBox::StandardButton)msgClose.exec();

这给了我这个: {{link1:法国按钮调整大小}}
需要注意的是,如果填充过多,它将开始覆盖文本 - 这一点我真的不明白 - 但3px似乎很好。
更新2:
在尝试了一下之后,我认为QMessageBox有一些固定的宽度与消息框文本本身相关联,无法修改。如果消息框文本足够长,按钮会自动调整大小并适应按钮文本,所以似乎按钮调整大小与按钮文本本身无关。
我尝试使用setMinimumWidth和setFixedWidth进行调整,但对话框根本不会调整大小。根据这个错误的评论QTBUG-7851,我认为QMessageBox无法通过编程方式调整大小。如果有人知道一个实际的解决方案,而不是制作一个自定义对话框,那就太好了。
更新3:
基于cbuchart的评论,我意识到有一个.qss样式表,其中有一个min-width设置导致QPushButton无法正确调整大小。
1个回答

3

不需要使用样式表,但仍需手动创建对象,而非使用QMessageBox::question

您可以使用QLayout::setSizeConstraint更改消息框布局以自动扩展。这将强制对话框调整大小并适应其内容。

示例(也可在此处找到):

#include <QtWidgets/QApplication>
#include <qmessagebox.h>
#include <qlayout.h>

int main(int argc, char* argv[])
{
  QApplication a(argc, argv);

  QMessageBox::StandardButtons iButtons = QMessageBox::Save | QMessageBox::Abort | QMessageBox::Cancel;
  QMessageBox msgClose( QMessageBox::Question, "Test", "Test button translation resizing.", iButtons );
  msgClose.setButtonText(QMessageBox::Save, "Save: super mega long text for testing");
  msgClose.setButtonText(QMessageBox::Cancel, "Cancel: another super mega long text for testing");
  msgClose.layout()->setSizeConstraint(QLayout::SetMinimumSize); // QLayout::SetFixedSize also works
  msgClose.exec();

  return 0;
}

当我测试“保存”、“放弃”和“取消”时,通过您的回答,我能够正确调整翻译后的按钮大小。但是当我尝试将其应用于我的工作场景时出现了问题。如果只有一个其他按钮(例如“保存”+“放弃”或“放弃”+“取消”),则翻译为“Discard”(“Ne pas tenir compte”)的文本才能正常工作。但是,当我有所有3个按钮(“保存”、“放弃”和“取消”)时,它似乎无法正常工作。最后,我通过添加填充来使其正常工作,如msgClose.setStyleSheet( "QPushButton {padding: 1px;}" ); ,但不确定这是否是正确的方法? - cechow
抱歉,经过一番努力,我必须说这并不是我的问题的实际解决方案。似乎周围的按钮会影响长度,也许消息框本身基于消息文本具有某些固定大小,一旦按钮达到该长度,它就不会再扩展了。 - cechow
好奇的是,就像您在测试中看到的那样,我包括了超长的标签...也许还有其他一些因素,比如使用的样式表或窗口管理器? 我现在无法进行更多的测试,要等接下来的两个星期才行 ;) - cbuchart
你可能是对的,有一个正在使用的样式表。我会看看里面是否有任何阻止调整大小的内容,谢谢! - cechow
1
是的,正是样式表引起了问题,现在我已经正确地调整了大小。 感谢您的帮助。 - cechow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接