如何调整QMessageBox按钮的大小以适合翻译后的文本?

时间:2018-08-03 19:33:43

标签: c++ qt localization internationalization qmessagebox

我目前正在研究应用程序的本地化。一切都按我的预期进行翻译,但是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();

这给了我这个: French Buttons Resized

要注意的是,如果填充过多,它将开始覆盖文本-我不太了解-但是3px似乎不错。

更新2:

在试用之后,我认为QMessageBox具有一些固定宽度,该宽度链接到消息框文本本身,无法修改。如果消息框文本足够长,则按钮会调整大小并适合按钮文本,因此按钮调整大小似乎与按钮文本本身无关。

我尝试使用setMinimumWidthsetFixedWidth进行调整,但框没有调整大小。根据此错误QTBUG-7851中的评论,我认为无法QMessageBox以编程方式调整大小。如果有人知道解决此问题的实际方法(不包括创建自定义对话框),那就太好了。

更新3:

根据cbuchart的评论,我意识到存在一个.qss样式表,该样式表具有min-width设置,导致QPushButton s的大小无法正确调整。

1 个答案:

答案 0 :(得分:2)

尽管您仍然必须手动创建对象而不是使用QMessageBox::question,但无需使用样式表。

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

示例(也可以在here中找到):

#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;
}