C++ GUI Qt4编程(13)-6.2preferencedialog
1. 主要介绍了QStackedLayout、QListWidget、QDialogButtonBox的简单用法。
2. QStackedLayout:
要使某个特定的子窗口部件可见,可以用setCurrentIndex()函数调用页号来实现。
使用indexOf()可以获取子窗口部件的页号。
3. 创建此对话框的简单步骤:
1) 建立一个QListWidget和一个QStackedWidget,并添加到QGridLayout布局中。
2) 在QListWidget中用addItem(),添加新的项目(或者说是新列表?)。
3) 在QStackedWidget中,新建QWisget类的分页,并用自窗口部件和布局来填充分页。
4) 在QGridLayout中添加QDialogButtonBox按钮。
5) 将列表窗口部件的currentRowChanged(int)信号和分组窗口部件的setCurrentIndex(int)
槽连接起来。实现单击列表,在分组窗口中显示对应的信息。
6) 把列表框的currentRow属性值设为0。
4. 使用QTabWidget会比此方法更简单。
5. preferencedialog.cpp
1 /**/ 2 #include "preferencedialog.h" 3 4 #include <QListWidget> 5 #include <QStackedLayout> 6 #include <QGridLayout> 7 #include <QLabel> 8 #include <QVBoxLayout> 9 #include <QPushButton> 10 #include <QDialogButtonBox> 11 12 PreferenceDialog::PreferenceDialog(QWidget *parent) 13 : QWidget(parent) 14 { 15 createAppearancePage(); 16 createWebBrowserPage(); 17 createMailAndNewsPage(); 18 createAdvancedPage(); 19 20 buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | 21 QDialogButtonBox::Cancel); 22 23 listWidget = new QListWidget; 24 listWidget->addItem(tr("Appearance")); 25 listWidget->addItem(tr("Web Browse")); 26 listWidget->addItem(tr("Mail & News")); 27 listWidget->addItem(tr("Advanced")); 28 29 stackedLayout = new QStackedLayout; 30 stackedLayout->addWidget(appearancePage); 31 stackedLayout->addWidget(webBrowserPage); 32 stackedLayout->addWidget(mailAndNewsPage); 33 stackedLayout->addWidget(advancedPage); 34 35 connect(listWidget, SIGNAL(currentRowChanged(int)), 36 stackedLayout, SLOT(setCurrentIndex(int))); 37 38 39 QGridLayout *mainLayout = new QGridLayout; 40 mainLayout->addWidget(listWidget, 0, 0); 41 mainLayout->addLayout(stackedLayout, 0, 1); 42 mainLayout->addWidget(buttonBox, 1, 0, 1, 2); 43 44 setLayout(mainLayout); 45 46 listWidget->setCurrentRow(0); /*设置起始页*/ 47 } 48 49 void PreferenceDialog::createAppearancePage() 50 { 51 appearancePage = new QWidget; 52 53 QLabel *appearanceLabel = new QLabel(tr("appearance")); 54 QVBoxLayout *layout = new QVBoxLayout; 55 layout->addWidget(appearanceLabel); 56 57 appearancePage->setLayout(layout); 58 } 59 60 void PreferenceDialog::createWebBrowserPage() 61 { 62 webBrowserPage = new QWidget; 63 64 QPushButton *webBrowserButton = new QPushButton(tr("web browser")); 65 QVBoxLayout *layout = new QVBoxLayout; 66 layout->addWidget(webBrowserButton); 67 68 webBrowserPage->setLayout(layout); 69 } 70 71 void PreferenceDialog::createMailAndNewsPage() 72 { 73 mailAndNewsPage = new QWidget; 74 75 QLabel *mailAndNewsLabel = new QLabel(tr("mail & news")); 76 QVBoxLayout *layout = new QVBoxLayout; 77 layout->addWidget(mailAndNewsLabel); 78 79 mailAndNewsPage->setLayout(layout); 80 } 81 82 void PreferenceDialog::createAdvancedPage() 83 { 84 advancedPage = new QWidget; 85 86 QPushButton *advancedButton = new QPushButton(tr("advanced")); 87 QVBoxLayout *layout = new QVBoxLayout; 88 layout->addWidget(advancedButton); 89 90 advancedPage->setLayout(layout); 91 }
6. preferencedialog.h
1 /**/ 2 #ifndef PREFERENCEDIALOG_H 3 #define PREFERENCEDIALOG_H 4 5 #include <QWidget> 6 7 class QListWidget; 8 class QStackedLayout; 9 class QDialogButtonBox; 10 11 class PreferenceDialog : public QWidget 12 { 13 Q_OBJECT 14 15 public: 16 PreferenceDialog(QWidget *parent = 0); 17 18 private: 19 QListWidget *listWidget; 20 QStackedLayout *stackedLayout; 21 QWidget *appearancePage; 22 QWidget *webBrowserPage; 23 QWidget *mailAndNewsPage; 24 QWidget *advancedPage; 25 QDialogButtonBox *buttonBox; 26 27 void createAppearancePage(); 28 void createWebBrowserPage(); 29 void createMailAndNewsPage(); 30 void createAdvancedPage(); 31 }; 32 33 #endif /*PREFERENCEDIALOG_H*/
7. main.cpp
1 /**/ 2 #include <QApplication> 3 #include "preferencedialog.h" 4 5 int main(int argc, char *argv[]) 6 { 7 QApplication app(argc, argv); 8 9 PreferenceDialog dialog; 10 dialog.show(); 11 12 return app.exec(); 13 }
8. 效果