2015-07-13 1295 views
4
#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(); 
} 

enter image description hereQMessageBox提示不显示整个标题

两种方法产生这种消息框,其中显示不正确的标题。我试图通过它调整对话框小部件的大小并没有帮助。我如何强制QMessageBox显示整个标题?

作为一种解决方法,我可以为标题文本添加尾随空格,但我认为应该有更好的解决方案。

[email protected]:~/qt$ qmake --version 
QMake version 2.01a 
Using Qt version 4.8.6 in /usr/lib/x86_64-linux-gnu 
+0

您是如何尝试调整对话框小部件的大小的? – TheDarkKnight

+0

通过调用'QWidget :: resize()' – Ashot

+3

试试[setMinimumSize](http://doc.qt.io/qt-5/qwidget.html#minimumSize-prop) – TheDarkKnight

回答

1

我试图创建QMessageBox与QT帮助qmessagebox.cpp提到的构造函数,但它并没有为我工作了。 由于某种原因,QMessageBox调整大小以适应窗口标题不起作用。但是,您可以通过创建QMessageBox自己的子类别来调整MessageBox大小。

请看下面的例子;

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); 
      } 
     } 
    }; 
+0

我明白了,但无法理解你为什么要在方法中明确地设置文本,标题和图标。他们不是已经设置了构造函数吗? – Ashot

1

似乎QMessageBox提示,当与EXEC推出()检查体文本的长度,并自动调整大小,忽略的事实,即标题文本可能会更长。由于出现这种情况,消息框启动后,在尺寸上的变化可见

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(); 

:虽然不理想,你可以事后与QTimer改变它,因为这里展示。

更好的解决方案就是创建自己的MessageBox,派生自QDialog。毕竟,QMessageBox类只是一个方便的小部件。

+0

我试过这个解决方案。它工作,如果我改变pTimer->开始(30),而不是pTimer->开始(0)。但它也打印此消息'QCoreApplication :: postEvent:意外的空接收器 '我已修改此代码。我已经使回调函数成为空类的成员槽功能。 – Ashot

+0

我刚刚检查过,我没有提到你的警告,所以要么是Linux特有的,要么是其他原因导致的。我怀疑计时器是0或30是一个计时问题。使用'0'意味着一旦事件队列被处理,事件就会被发布。如果它在MessageBox启动之前发生,那么你不会看到任何区别。无论哪种方式,这听起来像是为你工作; O) – TheDarkKnight

1

由于exec()show()都覆盖基础上框的文本内容的最小尺寸,简单的解决方法是不使用exec()设置最小尺寸已经显示出后箱。无论如何,你永远不应该在对话框中使用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(); 
} 
+0

这段代码不适合我。它显示旧的消息框。 – Ashot

+0

@Ashot你是什么意思的“旧”的消息框? –

+0

我的意思是它不会改变任何东西。 – Ashot