我想创建一个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
是问题,但如果我只在QMessageBox中添加tmpStrTmp
,则会显示其内容。所以,我认为这是一个空间问题,我尝试了这两种方式:
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;
但没有成功......有什么帮助吗?感谢
答案 0 :(得分:3)
如果您不希望QMessageBox简单地扩展文本,并在某个时刻断开新行,则应创建QMessageBox的实例并将其设置为具有固定宽度(QWidget::setFixedWidth()
)
另一种选择是传入一个带有新行(\n
)的文本字符串,它可以很好地处理它。
此外,如果您正在使用实例,您可以告诉它您正在使用RichText,并传入html标记的子集QMessageBox::setTextFormat(Qt::RichText)
,或者甚至只是确保在第一个之前使用有效的html标记换行符。
希望有所帮助!
答案 1 :(得分: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();