【问题标题】:Adapt QMessageBox size to its text size使 QMessageBox 大小适应其文本大小
【发布时间】:2014-04-11 15:15:35
【问题描述】:

我想创建一个QMessageBox::critical,它会根据内容(消息文本)的大小自动调整其大小。我该怎么做?

这是我想在 QMessageBox 上显示的消息

std::wstring tmpStrEx;
QDomNode tmpNodeParent = node.parentNode();

while(!tmpNodeParent.isNull() && tmpNodeParent.nodeName().toStdWString() != L"root"){
std::wstring tmpStrTmp;

tmpStrTmp = L"<"
           + tmpNodeParent.nodeName().toStdWString()
           + L" nm=\""
           + tmpNodeParent.toElement().attribute(QS(_T("nm")), QS(_T("undef")) ).toStdWString()
           + L"> ";
}

QString mex = "Error while reading vector.<br/><br/>Please check in:<br/><br/> " + tmpStrTmp ;

tmpStrTmp 可以类似于 &lt;vct nm="name"&gt; &lt;vcx nm="xyz"&gt;

我尝试通过这些方式构建 QMessageBox:

先来个简单的:

QMessageBox::critical(this, "Error", mex);

这显示一半消息没有 tmpStrTmp 中的内容,如下所示:

读取向量时出错。

请签到:

我认为tmpStrTmp 是问题所在,但如果我只将tmpStrTmp 放在QMessageBox 中,它会显示其内容。所以,我以为是空间的问题,我尝试了这两种方法:

1.

 QMessageBox msgBox;
 QSpacerItem* spacer = new QSpacerItem(500, 500, QSizePolicy::Minimum, QSizePolicy::Expanding);
 msgBox.setTextFormat(Qt::RichText);
 msgBox.setText( mex );
 QGridLayout* layout = (QGridLayout*)msgBox.layout();
 layout->addItem(spacer, layout->rowCount(), 0, 1, layout->columnCount());
 msgBox.exec();

2.

 QMessageBox *box = new QMessageBox::QMessageBox(QMessageBox::critical, "Error", mex);

 QGridLayout *layout = qobject_cast<QGridLayout *>(box->layout());
 if (layout) {
    QTextEdit *edit = new QTextEdit(mex);
    edit->setReadOnly(true);
    layout->addWidget(edit, 0, 1);
 }
 box->exec();
 delete box;

但没有成功...有什么帮助吗?谢谢

【问题讨论】:

  • 你试过了吗?
  • 文本根据长度分成多行。所以你不希望文本在多行并且消息框水平增长?
  • 这个问题似乎是题外话,因为没有显示任何尝试。它也可能因不明原因而关闭。
  • 这里可能有一些相关的黑客攻击:qtcentre.org/threads/22298-QMessageBox-Controlling-the-width 但你需要更具体一点。消息框自动调整大小。你想换行吗?你的文字有换行吗?请包含您尝试显示的内容以及您所看到内容的屏幕截图以及您想要看到的内容的描述。

标签: qt qmessagebox


【解决方案1】:

如果您不希望 QMessageBox 简单地随着您的文本变宽,并在某些时候换行,您应该创建一个 QMessageBox 实例并将其设置为具有固定宽度 (QWidget::setFixedWidth())。

另一种选择是传入一个带有新行的文本字符串 (\n),它可以很好地处理它。

另外,如果您使用的是实例,您可以告诉它您正在使用 RichText,并传入 html 标记的子集QMessageBox::setTextFormat(Qt::RichText),或者甚至只是确保您在第一个换行符之前使用有效的 html 标记.

希望有帮助!

【讨论】:

  • QMessageBox::critical 默认情况下根据消息长度将消息文本分成多行。
  • 是的,但有时您最终会看到又长又瘦的文本框,这不是很吸引人。如果我担心它们的外观,我最终会让它们看起来更接近 4:3。
【解决方案2】:

QMessageBox 是一个网格。我不确定如何使 QMessageBox 大小适应其文本大小,但如果您知道消息框中将出现什么,您绝对可以通过这种方式将其设置为最小(实际上是固定的)大小:-

QMessageBox messageBox;
QSpacerItem* horizontalSpacer = new QSpacerItem(500, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
messageBox.setText( "Put text here" );
QGridLayout* layout = (QGridLayout*)messageBox.layout();
layout->addItem(horizontalSpacer, layout->rowCount(), 0, 1, layout->columnCount());
messageBox.exec();

【讨论】:

    猜你喜欢
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 2018-09-04
    • 1970-01-01
    • 2015-07-07
    • 2011-12-28
    • 1970-01-01
    相关资源
    最近更新 更多