2015-07-13 58 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