原创 QLayout 和QDialog 学习总结(一) 转

2011-3-15 18:42 3237 8 8 分类: MCU/ 嵌入式
QLayout和QDialog的学习总结(一)
2010-12-11 11:03

最近在学习Qt,首先从QDialogQLayout熟悉开始。以下面的例子进行熟悉,主要是用stacked widget实现QWidget界面的变换。

窗体界面:

 

思路分析:

1.利用QWidgetList包含QWidgetItem类进行界面的选择;

2.基于QWidget类的QueryPage, UpdatePage, ConfigurationPage的各个界面类,再将其加入到QStackedWidget类中。

3.最后根据基于QListWidgetcontentsWidget发出SIGNAL信号改变QWidget的界面。

代码分析:

代码主要包含pages.h, pages.cpp, configdialog.h, configdialog.cppmain.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条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条