Qt:怎樣給QMessageBox添加自訂視窗

來源:互聯網
上載者:User

        因為需要在QMessageBox 上添加複選框,百度了半天居然沒發現相關的東東,最後還是從老外那邊找到了想要的。跟大家共用一下。我英語不好,大家見諒哈。

       原文意思大概如下:

       Qt提供了功能強大的QMessageBox類可以以作業系統的本地風格來顯示對話方塊。當涉及按鈕布局,訊息表徵圖或訊息文本的風格時,這個類很靈活。但很不幸QMessageBox不支援自訂視窗,例如添加複選框或一組選項按鈕。

       然而,結果表明如果你瞭解QMessageBox布局的內部結構時,你可以很容易的添加自訂的視窗。

右過的圖顯示的是QMessageBox的頂層布局(QGridLayout),它包括了訊息表徵圖、訊息文本和按鈕集合。其中訊息表徵圖佔據了[0,0]和[1,0]單元,訊息文本位於[0,1]單元,而按鈕集合佔據了[2,0]和[2,1]單元。我們感興趣的部分是[1,1]單元(informative text),它通過QMessageBox::setInformativeText()設定,僅用於對訊息文本作詳細的說明。

      總之,如果你不使用informative text,你就有地方放置你的自訂視窗!添加多個按鈕-修正邊緣/間隔.在此我們推薦豎向布局(QVBoxLayout)來排列你的自訂視窗:

 bool showMessageBox(QWidget * pParent)
{
   // 建立你需要的訊息框
   QMessageBox mb(QMessageBox::Information,
                  tr("My message-box"),
                  tr("The quick brown fox.."),
                  QMessageBox::Ok,
                  pParent);
 
   // 建立一個豎向布局並插入到你的訊息框中
   QVBoxLayout * pLayout = new QVBoxLayout(this);
   //mb.layout()->addWidget(pLayout, 1, 1);//作者註明此句有誤,應改成下一句,並說明在實際應用中dynamic_cast轉換後應該檢查非空
   dynamic_cast< QGridLayout *>(mb.layout())->addWidget(pLayout, 1, 1); //Qt4.4.0 時addWidget應該改成addLayout ,

 
   // 添加自訂視窗
   [...]
 
   // 顯示訊息框並等待使用者的輸入
   if(mb.exec() != QMessageBox::Ok) {
 
      return false;
   }
 
   // 處理使用者的選擇
   [...]
 
   return true;
}

 

 

例如 建立一個自訂的複選框...

// 添加自訂視窗
   QCheckBox * pCheckBox = new QCheckBox
                      (tr("Don't show this dialog again"),
                      pParent);
 
   pLayout->addWidget(pCheckBox);
 
   [...] 

 

…建立一組選項按鈕 (有自已的豎向布局和間距!)…

// 添加自訂視窗
   QButtonGroup * pBtnGroup = new QButtonGroup(pParent);
 
   QVBoxLayout * pSubLayout = new QVBoxLayout(pParent);
   pSubLayout->setSpacing(2);
   pLayout->addLayout(pSubLayout);
 
   QRadioButton * pRadio1 = new QRadioButton(tr("One"),
                                             pParent);
   pSubLayout->addWidget(pRadio1);
   pBtnGroup->addButton(pRadio1, 0);
 
   QRadioButton * pRadio2 = new QRadioButton(tr("Two"),
                                             pParent);
   pSubLayout->addWidget(pRadio2);
   pBtnGroup->addButton(pRadio2, 0);
 
   QRadioButton * pRadio3 = new QRadioButton(tr("Three"),
                                             pParent);
   pSubLayout->addWidget(pRadio3);
   pBtnGroup->addButton(pRadio3, 0);
 
   [...] 

…建立其他自訂視窗!

 

請注意:上述的技術只在Windows XP, Windows Vista, 和幾種Linux系列的系統平台下,在Qt 4.2.x 和4.3.x (以及Qt 4.4.x的Technical Review)上測試通過了。不知道同樣的方法在其他版本的Qt或作業系統下是否能成功。請在評論裡寫下你的經驗吧!

 

原文:http://blog.beef.de/2008/01/12/qmessagebox-widgets/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.