最近在学习Qt,首先从QDialog和QLayout熟悉开始。以下面的例子进行熟悉,主要是用stacked widget实现QWidget界面的变换。 窗体界面:
思路分析: 1.利用QWidgetList包含QWidgetItem类进行界面的选择; 2.基于QWidget类的QueryPage, UpdatePage, ConfigurationPage的各个界面类,再将其加入到QStackedWidget类中。 3.最后根据基于QListWidget的contentsWidget发出SIGNAL信号改变QWidget的界面。 代码分析: 代码主要包含pages.h, pages.cpp, configdialog.h, configdialog.cpp,main.cpp。前两个代码主要实现QWidget界面的设计,configdialog.h, configdialog.cpp是主界面转换的调用和MainLayout的界面的设计。 pages.cpp: #include <QtGui>#include "pages.h"ConfigurationPage::ConfigurationPage(QWidget *parent) : QWidget(parent) {//构建一个分组框 QGroupBox *configGroup = new QGroupBox(tr("Server configuration")); QLabel *serverLabel = new QLabel(tr("Server:")); QComboBox *serverCombo = new QComboBox; serverCombo->addItem(tr("Qt (Australia)"));//组合框加入项目 serverCombo->addItem(tr("Qt (Germany)")); serverCombo->addItem(tr("Qt (Norway)")); serverCombo->addItem(tr("Qt (People's Republic of China)")); serverCombo->addItem(tr("Qt (USA)")); QHBoxLayout *serverLayout = new QHBoxLayout;//创建一个水平布局管理器 serverLayout->addWidget(serverLabel);//将控件加入布局中 serverLayout->addWidget(serverCombo); QVBoxLayout *configLayout = new QVBoxLayout; configLayout->addLayout(serverLayout); configGroup->setLayout(configLayout);//将configGroup设置成垂直布局 QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(configGroup); mainLayout->addStretch(1);//加入一个弹簧撑起布局 setLayout(mainLayout);} UpdatePage::UpdatePage(QWidget *parent) : QWidget(parent){ QGroupBox *updateGroup = new QGroupBox(tr("Package selection")); QCheckBox *systemCheckBox = new QCheckBox(tr("Update system")); QCheckBox *appsCheckBox = new QCheckBox(tr("Update applications")); QCheckBox *docsCheckBox = new QCheckBox(tr("Update documentation")); QGroupBox *packageGroup = new QGroupBox(tr("Existing packages")); QListWidget *packageList = new QListWidget;//构建一个窗体列表 QListWidgetItem *qtItem = new QListWidgetItem(packageList);//加入窗体列表项 qtItem->setText(tr("Qt")); QListWidgetItem *qsaItem = new QListWidgetItem(packageList); qsaItem->setText(tr("QSA")); QListWidgetItem *teamBuilderItem = new QListWidgetItem(packageList); teamBuilderItem->setText(tr("Teambuilder")); QPushButton *startUpdateButton = new QPushButton(tr("Start update")); QVBoxLayout *updateLayout = new QVBoxLayout; updateLayout->addWidget(systemCheckBox); updateLayout->addWidget(appsCheckBox); updateLayout->addWidget(docsCheckBox); updateGroup->setLayout(updateLayout); QVBoxLayout *packageLayout = new QVBoxLayout; packageLayout->addWidget(packageList); packageGroup->setLayout(packageLayout); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(updateGroup); mainLayout->addWidget(packageGroup); mainLayout->addSpacing(12);//设置控件间的间距 mainLayout->addWidget(startUpdateButton); mainLayout->addStretch(1); setLayout(mainLayout);} QueryPage::QueryPage(QWidget *parent) : QWidget(parent){ QGroupBox *packagesGroup = new QGroupBox(tr("Look for packages")); QLabel *nameLabel = new QLabel(tr("Name:")); QLineEdit *nameEdit = new QLineEdit; QLabel *dateLabel = new QLabel(tr("Released after:")); QDateTimeEdit *dateEdit = new QDateTimeEdit(QDate::currentDate()); QCheckBox *releasesCheckBox = new QCheckBox(tr("Releases")); QCheckBox *upgradesCheckBox = new QCheckBox(tr("Upgrades")); QSpinBox *hitsSpinBox = new QSpinBox; hitsSpinBox->setPrefix(tr("Return up to ")); hitsSpinBox->setSuffix(tr(" results")); hitsSpinBox->setSpecialValueText(tr("Return only the first result")); hitsSpinBox->setMinimum(1); hitsSpinBox->setMaximum(100); hitsSpinBox->setSingleStep(10); QPushButton *startQueryButton = new QPushButton(tr("Start query")); QGridLayout *packagesLayout = new QGridLayout;//创建一个网格布局 packagesLayout->addWidget(nameLabel, 0, 0); packagesLayout->addWidget(nameEdit, 0, 1); packagesLayout->addWidget(dateLabel, 1, 0); packagesLayout->addWidget(dateEdit, 1, 1); packagesLayout->addWidget(releasesCheckBox, 2, 0); packagesLayout->addWidget(upgradesCheckBox, 3, 0); packagesLayout->addWidget(hitsSpinBox, 4, 0, 1, 2); packagesGroup->setLayout(packagesLayout); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(packagesGroup); mainLayout->addSpacing(12); mainLayout->addWidget(startQueryButton); mainLayout->addStretch(1); setLayout(mainLayout);} configdialog.cpp: #include <QtGui>#include "configdialog.h"#include "pages.h"ConfigDialog::ConfigDialog(){ contentsWidget = new QListWidget;//创建一个窗口列表并设定模式 contentsWidget->setViewMode(QListView::IconMode); contentsWidget->setIconSize(QSize(96, 84)); contentsWidget->setMovement(QListView::Static); contentsWidget->setMaximumWidth(128); contentsWidget->setSpacing(12);//设定各个框之间的间距 pagesWidget = new QStackedWidget;//窗体堆栈,所建立的几个窗体存储在这 pagesWidget->addWidget(new ConfigurationPage); pagesWidget->addWidget(new UpdatePage); pagesWidget->addWidget(new QueryPage); QPushButton *closeButton = new QPushButton(tr("Close")); createIcons(); contentsWidget->setCurrentRow(0); connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); QHBoxLayout *horizontalLayout = new QHBoxLayout; horizontalLayout->addWidget(contentsWidget); horizontalLayout->addWidget(pagesWidget, 1); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addStretch(1); buttonsLayout->addWidget(closeButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(horizontalLayout); mainLayout->addStretch(1); mainLayout->addSpacing(12); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); setWindowTitle(tr("Config Dialog"));} void ConfigDialog::createIcons(){//把创建的窗口列表项加入到窗口列表中,设置对齐方式和图标格式 QListWidgetItem *configButton = new QListWidgetItem(contentsWidget); configButton->setIcon(QIcon(":/images/config.png")); configButton->setText(tr("Configuration")); configButton->setTextAlignment(Qt::AlignHCenter); configButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *updateButton = new QListWidgetItem(contentsWidget); updateButton->setIcon(QIcon(":/images/update.png")); updateButton->setText(tr("Update")); updateButton->setTextAlignment(Qt::AlignHCenter); updateButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); QListWidgetItem *queryButton = new QListWidgetItem(contentsWidget); queryButton->setIcon(QIcon(":/images/query.png")); queryButton->setText(tr("Query")); queryButton->setTextAlignment(Qt::AlignHCenter); queryButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);//一旦列表框中发生选择变化,就会引起窗体堆栈中的显示发生变化 connect(contentsWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(changePage(QListWidgetItem*,QListWidgetItem*)));} void ConfigDialog::changePage(QListWidgetItem *current, QListWidgetItem *previous){ if (!current) current = previous; pagesWidget->setCurrentIndex(contentsWidget->row(current));} |
文章评论(0条评论)
登录后参与讨论