-1

我想创建一个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可以是类似的东西<vct nm="name"> <vcx nm="xyz">

我尝试以这些方式构建 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;

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

4

2 回答 2

3

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

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

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

希望有帮助!

于 2014-04-11T16:28:14.863 回答
1

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();
于 2014-09-24T07:19:31.707 回答