因為需要在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/
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/diaopan1985/archive/2009/08/01/4399432.aspx
#include
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
/*msgBox w;
w.show();*/
QMessageBox msgBox(QMessageBox::Warning, "", "Do You wish to save file?",
0, NULL, Qt::Sheet);
QCheckBox dontPrompt("Do not prompt again", &msgBox);
//msgBox.addButton(&dontPrompt, QMessageBox::ActionRole);
msgBox.layout()->addWidget(&dontPrompt);
QPushButton* pOK = msgBox.addButton("OK", QMessageBox::AcceptRole);
pOK->setMaximumSize(200, 31);
pOK->setMinimumSize(70, 31);
msgBox.exec();
bool b = dontPrompt.checkState();
qDebug() << "result=" << b;
return a.exec();
}
// 改進版本 注意Title, 與addButton對象的位置
#include
#include
{
QApplication a(argc, argv);
/*msgBox w;
w.show();*/
0, NULL, Qt::Sheet);
msgBox.setFixedWidth(200);
QCheckBox dontPrompt("Do not prompt again", &msgBox);
QCheckBox dontPrompt2("Do not prompt again8888888", &msgBox);
QPushButton* pAdd = new QPushButton("add");
QPushButton* pSave = msgBox.addButton(QMessageBox::Save);
QPushButton* pOK = msgBox.addButton(QMessageBox::Close);
QLabel* pLabel = new QLabel("ddddddddddddddddddddddddddddddddddddddddddddddddddddd\ndddddddddddddddddddddddddddddddddddd\nddddddddddddddddddddddddddddddddddddddddddddddddddddddd\ndddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd");
pLabel->setScaledContents(true);
pLabel->setIndent(20);
QSpacerItem *pSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
dynamic_cast< QGridLayout *>(msgBox.layout())->addWidget(&dontPrompt, 2, 1,1,4);
dynamic_cast< QGridLayout *>(msgBox.layout())->addWidget(&dontPrompt2, 3, 1,1,4);
dynamic_cast< QGridLayout *>(msgBox.layout())->addItem(pSpacer, 4, 1);
dynamic_cast< QGridLayout *>(msgBox.layout())->addWidget(pAdd, 4, 2);
dynamic_cast< QGridLayout *>(msgBox.layout())->addWidget(pSave, 4, 3);
dynamic_cast< QGridLayout *>(msgBox.layout())->addWidget(pOK, 4, 4);
QList lWgt = msgBox.buttons();
foreach(QAbstractButton *btn, lWgt)
{
qDebug() << "btn = " << btn->text();
i++;
}
//pOK->setMaximumSize(200, 31);
//pOK->setMinimumSize(70, 31);
msgBox.exec();
bool b = dontPrompt.checkState();
bool b2 = dontPrompt.checkState();
qDebug() << "result=" << b;
qDebug() << "result=" << b2;
return a.exec();
QApplication a(argc, argv); /*msgBox w; w.show();*/ QMessageBox msgBox(QMessageBox::NoIcon, "每組打印條數", "", 0, NULL); msgBox.setFixedWidth(200); QCheckBox dontPrompt("Do not prompt again", &msgBox); QCheckBox dontPrompt2("Do not prompt again8888888", &msgBox); QPushButton *pAdd = new QPushButton("add"); QPushButton* pSave = msgBox.addButton(QMessageBox::Save); QPushButton* pOK = msgBox.addButton(QMessageBox::Close); msgBox.addButton(pAdd,QMessageBox::DestructiveRole); msgBox.setDefaultButton(pAdd); QLabel* pLabel = new QLabel("enter a int number "); pLabel->setScaledContents(true); pLabel->setIndent(20); QSpacerItem *pSpacer = new QSpacerItem(20, 10, QSizePolicy::Minimum, QSizePolicy::Minimum); dynamic_cast< QGridLayout *>(msgBox.layout())->addWidget(pLabel, 0, 1, 1, 1); dynamic_cast< QGridLayout *>(msgBox.layout())->addWidget(&dontPrompt, 3, 1,1,4); dynamic_cast< QGridLayout *>(msgBox.layout())->addWidget(&dontPrompt2, 4, 1,1,4); dynamic_cast< QGridLayout *>(msgBox.layout())->addItem(pSpacer, 5, 1); dynamic_cast< QGridLayout *>(msgBox.layout())->addWidget(pAdd, 5, 2); dynamic_cast< QGridLayout *>(msgBox.layout())->addWidget(pSave, 5, 3); dynamic_cast< QGridLayout *>(msgBox.layout())->addWidget(pOK, 5, 4); int i=1; QList<QAbstractButton *> lWgt = msgBox.buttons(); qDebug()<<lWgt.length(); foreach(QAbstractButton *btn, lWgt) { qDebug() << "btn = " << btn->text(); i++; } //pOK->setMaximumSize(200, 31); //pOK->setMinimumSize(70, 31); msgBox.exec(); bool b = dontPrompt.checkState(); bool b2 = dontPrompt2.checkState(); qDebug() << "result=" << b; qDebug() << "result=" << b2; return a.exec();