#include <QtGui>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
// first
QMessageBox box(0);
box.setText("short text");
box.setWindowTitle("looooooooooooooooong text");
box.setMinimumSize(800, 0);
box.exec();
// second
//QMessageBox::warning(0, "looooooooooooooooong text", "short text");
return app.exec();
}
这两种方法都会生成此消息框,其中标题未正确显示。我试图通过它没有帮助调整对话框小部件的大小。如何强制QMessageBox显示整个标题?
作为一种解决方法,我可以为标题文本添加尾随空格,但我认为应该有更好的解决方案。
aminasya@aminasya-desktop:~/qt$ qmake --version
QMake version 2.01a
Using Qt version 4.8.6 in /usr/lib/x86_64-linux-gnu
答案 0 :(得分:1)
我尝试使用QMessageBox
中提到的qt帮助的构造函数创建qmessagebox.cpp
,但它对我也没有用。
出于某种原因QMessageBox
调整大小以适应窗口标题不起作用。但是,您可以通过创建自己的MessageBox
子类来调整QMessageBox
大小。
请参阅下面的例子;
class MyMessageBox : public QMessageBox
{
public:
explicit MyMessageBox(QWidget *parent = 0) : QMessageBox(parent) { }
MyMessageBox(const QString &title, const QString &text, Icon icon,
int button0, int button1, int button2,
QWidget *parent = 0,
Qt::WindowFlags f = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint) :
QMessageBox(title, text, icon, button0, button1, button2, parent, f) { }
static void about(QString title, QString text)
{
MyMessageBox aboutBox(title, text, QMessageBox::Information, 0, 0, 0, NULL);
aboutBox.setText(title);
aboutBox.setText(text);
QIcon icon = aboutBox.windowIcon();
QSize size = icon.actualSize(QSize(64, 64));
aboutBox.setIconPixmap(icon.pixmap(size));
aboutBox.exec();
}
void showEvent(QShowEvent *event)
{
QMessageBox::showEvent(event);
QWidget *textField = findChild<QWidget *>("qt_msgbox_label");
if (textField != NULL)
{
// getting what ever my system has set for the window title font
QFont font = QFont("Ubuntu Bold", 11);
// you might want to make it more generic by detecting the actuall font
// or using smth like this:
//QFont font = QApplication::font("QWorkspaceTitleBar");
QFontMetrics fm(font);
int width = qMax(fm.width(windowTitle()) + 50, textField->minimumWidth());
textField->setMinimumWidth(width);
}
}
};
答案 1 :(得分:1)
看起来QMessageBox在使用exec()启动时会检查正文文本的长度并自动调整大小,忽略标题文本可能更长的事实。虽然不理想,但您可以在之后使用QTimer进行更改,如下所示:
QMessageBox* box = new QMessageBox;
box->setText("short text");
box->setWindowTitle("looooooooooooooooong text");
QTimer* pTimer = new QTimer;
pTimer->setSingleShot(true);
QObject::connect(pTimer, &QTimer::timeout, [=](){
box->setMinimumWidth(400);
pTimer->deleteLater();
});
pTimer->start(0);
box->exec();
由于在启动消息框后会发生这种情况,因此可以看到大小的变化。
更好的解决方案就是创建自己的MessageBox,派生自QDialog。毕竟,QMessageBox类只是一个方便的小部件。
答案 2 :(得分:1)
由于exec()
和show()
都会根据框文本的内容覆盖您的最小尺寸,因此简单的解决方案是不使用exec()
和< / em>在显示框后设置最小尺寸。无论如何,你绝不应该在对话框中使用exec()
。
注意:窗口标题是不可移植的。没有窗口标题,您的UI仍然有意义。例如,在OS X上,消息框窗口标题是不可见的。
#include <QApplication>
#include <QMessageBox>
#include <QDebug>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QMessageBox box;
box.setText("short text");
box.setWindowTitle("looooooooooooooooong text");
box.show();
box.setMinimumSize(qMax(box.minimumWidth(), 800), box.minimumHeight());
return app.exec();
}
答案 3 :(得分:0)
由于消息框的宽度被调整为文本的宽度,一个简单的答案似乎是用空格填充文本字符串:
QString title = "This is a looooooooooooooooooooooooong title";
QString txt = "Short Text";
QMessageBox box;
box.setWindowTitle(title);
int titleLen = title.length();
int txtLen = txt.length();
if (txtLen < titleLen)
{
int diff = titleLen - txtLen;
txt.resize(titleLen + (diff * 2),' '); // diff * 2 is extra padding;
}
box.setText(txt);
box.exec();
你可以看到由于可变宽度的字体,我拼凑了填充长度。但是,嘿,kludge 对我有用。