【问题标题】:How to make QMessageBox buttons resized to fit translated text?如何调整 QMessageBox 按钮的大小以适应翻译文本?
【发布时间】:2019-01-11 17:28:00
【问题描述】:

我目前正在处理应用程序的本地化。一切都按我的预期翻译,但是,QMessageBox 不会调整按钮的大小以适应文本。

这是我用来生成问题框的代码,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();

这给了我这个:

需要注意的是,如果 padding 增加太多,它会开始覆盖文本 - 我不太明白 - 但 3px 似乎很好。

更新 2:

在玩过它之后,我认为QMessageBox 有一些固定的宽度,它与无法修改的消息框文本本身相关联。如果消息框文本足够长,按钮会调整大小并适合按钮文本,因此按钮调整大小似乎与按钮文本本身无关。

我尝试使用setMinimumWidthsetFixedWidth 进行调整,但框并没有调整大小。基于这个 bug QTBUG-7851 中的 cmets,我认为 QMessageBox 不能以编程方式调整大小。如果有人知道不包括制作自定义对话框的实际解决方案,那就太好了。

更新 3:

根据 cbuchart 的 cmets,我意识到有一个 .qss 样式表具有 min-width 设置导致 QPushButtons 无法正确调整大小。

【问题讨论】:

    标签: c++ qt localization internationalization qmessagebox


    【解决方案1】:

    没有必要使用样式表,尽管您仍然需要手动创建对象而不是使用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;
    }
    

    【讨论】:

    • 当我使用 SaveAbortCancel 进行测试时,我能够根据您的答案正确调整翻译后的按钮大小。当我尝试将其应用于我的工作场景时遇到了问题。如果只有一个其他按钮(例如Save+DiscardDiscard+Cancel),它似乎只适用于“丢弃”(“Ne pas tenir compte”)的翻译文本,但不是我有所有 3 个按钮(SaveDiscardCancel)。我终于通过使用msgClose.setStyleSheet( "QPushButton {padding: 1px;}" ); 添加填充来让它工作,但不确定这是否是正确的做法?
    • 对不起,经过一番折腾,我不得不说这不是我的问题的实际解决方案。似乎周围的按钮会影响长度,并且消息框本身可能具有基于消息文本本身的固定大小,一旦按钮达到该长度,它就不会延伸更多。
    • 很好奇,正如您在测试中看到的那样,我包含了超长标签...也许还有其他东西,例如使用的样式/样式表或 Windows 管理器?我现在无法在接下来的两周内进行进一步的测试;)
    • 您可能是对的,正在使用一个样式表。我去看看有没有什么东西阻碍了调整大小,谢谢!
    • 是的,这是导致问题的样式表,我现在可以正确调整大小。感谢您的帮助。
    猜你喜欢
    • 2016-11-24
    • 2020-04-25
    • 2013-08-28
    • 1970-01-01
    • 2016-05-27
    • 2016-10-06
    • 2016-11-27
    • 2018-09-04
    • 1970-01-01
    相关资源
    最近更新 更多