2011-04-07 81 views
2

我想創建一個簡單的關於對話框,但注意到QMessageBox::about不會將其大小調整爲標題的長度(通常由於字體較大,至少在我的桌面環境中)會更長,只能用於內容。有沒有辦法確保對話框的大小足以顯示所有標題?我當然可以爲aboutText添加空白區域,但我希望找到一個不太冒犯的解決方案。可以QMessageBox ::關於調整大小標題長度?

例子:

QString titleText("Some title which is slightly longer"); 
QString aboutText("Short about text"); 
QMessageBox::about(this,titleText,aboutText); 

目前上面的代碼只給了我「有的......」作爲標題字符串。我使用Qt 4.7在Ubuntu上構建了該程序。

+0

您可能想要使用構造函數中的'Qt :: WindowFlags'標誌(http://doc.qt.nokia.com/4.7/qmessagebox.html#QMessageBox-2)。 – Donotalo 2011-04-07 14:52:42

回答

1

我相信QMessageBox不調整大小以適合窗口標題,但由於某些原因,它沒有我的系統上的工作權利也,不知道這是否是一個錯誤或功能,這是在qmessagabox.cppQMessageBoxPrivate::updateSize()方法來完成。

我注意到的另一件事是,您正在使用QMessageBox類的實例調用about()方法,該方法是靜態的,您可以使用類名稱QMessageBox::about(..)來執行它。

你可以做什麼調整窗口的大小,創建自己的QMessageBox的子類,並調整在showEvent方法窗口的最小寬度,請參見下面的示例的詳細信息:

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

這裏是你如何可以稱之爲:

QString titleText("Some title which is slightly longer"); 
QString aboutText("Short about text"); 
MyMessageBox::about(titleText, aboutText); 

希望這會有所幫助,至於 「QMessageBox提示」 的

+0

非常感謝您的關注。奇怪的是,這給出了相同的結果...我嘗試使用'QApplication :: font'的第二選擇,並給了我標題字符串「About myNAME」的寬度爲145,並且它被切碎爲「關於我的...「。是否fontmetrics不會返回正確的值?順便說一句,+50是從哪裏來的? – fnokke 2011-04-11 08:47:20

+0

看起來好像setMinimumWidth()可能不工作,因爲使用此代碼,框也不會調整到我的內容? – fnokke 2011-04-11 10:42:52

3

使用 「setStyleSheet()」 函數。這是一個例子。

background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #787878, stop: 0.5 #404040, stop: 0.6 #303030, stop: 0.8 #252525, stop: 1 #151515); 
border: 2px solid #05b8cc; 
border-radius: 8px; 
color: white; 
min-width: 300px; 
min-height: 80px; 

它也會影響「QMessageBox」的孩子,他們的樣式表可以通過遍歷它們來恢復。訪問孩子使用「findChildren(QWidget)」。

相關問題