Qt入门(5)——用Qt控件创建一个电话本界面
具体实现步骤:
一、首先用 Qt Designer 创建一个两张图的对话框,分别保存为listdialog.ui和editdialog.ui文件
要注意其中各个空间对应的名称修改好
二、新建一个Qt应用程序工程,取名为listdialog
三、删除已有的listdialog.ui和ui_listdialog.h,listdialog.h,listdialog.cpp文件
四、将listdialog.ui和editdialog.ui文件复制到工程下并且导入到工程,运行,此时可能会报错,没关系
五、添加文件listdialog.h,listdialog.cpp,editdialog.h,editdialog.cpp
内容如下:
listdialog.h #ifndefLISTDIALOG_H #defineLISTDIALOG_H #include<QDialog> #include"ui_listdialog.h" classListDialog : public QDialog { Q_OBJECT public: ListDialog(); ~ListDialog(); privateslots: voidaddItem(); voideditItem(); voiddeleteItem(); private: Ui::ListDialogui; }; #endif// LISTDIALOG_H //////////////////////////////////////////////////////////////////////////// listdialog.cpp #include"listdialog.h" #include"editdialog.h" ListDialog::ListDialog():QDialog() { ui.setupUi(this); connect(ui.addButton,SIGNAL(clicked()),this,SLOT(addItem())); connect(ui.editButton,SIGNAL(clicked()),this,SLOT(editItem())); connect(ui.deleteButton,SIGNAL(clicked()),this,SLOT(deleteItem())); } ListDialog::~ListDialog() { } void ListDialog::addItem() { EditDialogdlg(this); if(dlg.exec()==1) ui.list->addItem(dlg.name()+"--"+dlg.number()); } void ListDialog::editItem() { if(!ui.list->currentItem()) return; QStringListparts=ui.list->currentItem()->text().split("--"); EditDialogdlg(this); dlg.setName(parts[0].trimmed()); dlg.setNumber(parts[1].trimmed()); if(dlg.exec()==1) ui.list->currentItem()->setText(dlg.name()+"--"+dlg.number()); } void ListDialog::deleteItem() { deleteui.list->currentItem(); } ////////////////////////////////////////////////////////////////////////////// editdialog.h #ifndefEDITDIALOG_H #defineEDITDIALOG_H #include<QDialog> #include"ui_editdialog.h" classEditDialog:public QDialog { public: EditDialog(QWidget*parent=0); constQString name() const; voidsetName(const QString&); constQString number() const; voidsetNumber(const QString&); private: Ui::EditDialogui; }; #endif //////////////////////////////////////////// editdialog.cpp #include"editdialog.h" EditDialog::EditDialog(QWidget*parent):QDialog(parent) { ui.setupUi(this); } const QString EditDialog::name()const { return ui.nameEdit->text().replace("--","").trimmed(); } const QString EditDialog::number() const { return ui.numberEdit->text().trimmed(); } void EditDialog::setName(const QString &name) { ui.nameEdit->setText(name); } voidEditDialog::setNumber(const QString &number) { ui.numberEdit->setText(number); }
注意还要查看自动生成的 ui_editdialog.h 和 ui_listdialog.h
根据需要修改类的名称,上例中需要将ui_editdialog.h修改为如下:
#ifndefUI_EDITDIALOG_H #defineUI_EDITDIALOG_H #include<QtCore/QVariant> #include <QtGui/QAction> #include<QtGui/QApplication> #include<QtGui/QButtonGroup> #include<QtGui/QDialog> #include<QtGui/QDialogButtonBox> #include<QtGui/QHBoxLayout> #include<QtGui/QHeaderView> #include<QtGui/QLabel> #include<QtGui/QLineEdit> #include <QtGui/QVBoxLayout> #include<QtGui/QWidget> QT_BEGIN_NAMESPACE class Ui_EditDialog { public: QDialogButtonBox*buttonBox; QWidget*layoutWidget; QHBoxLayout*horizontalLayout; QVBoxLayout*verticalLayout; QLabel*label; QLabel*label_2; QVBoxLayout*verticalLayout_2; QLineEdit*nameEdit; QLineEdit*numberEdit; voidsetupUi(QDialog *Dialog) { if(Dialog->objectName().isEmpty()) Dialog->setObjectName(QString::fromUtf8("Dialog")); Dialog->resize(360,125); buttonBox= new QDialogButtonBox(Dialog); buttonBox->setObjectName(QString::fromUtf8("buttonBox")); buttonBox->setGeometry(QRect(0,80, 341, 41)); buttonBox->setOrientation(Qt::Horizontal); buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); layoutWidget= new QWidget(Dialog); layoutWidget->setObjectName(QString::fromUtf8("layoutWidget")); layoutWidget->setGeometry(QRect(10,10, 331, 51)); horizontalLayout= new QHBoxLayout(layoutWidget); horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout")); horizontalLayout->setContentsMargins(0,0, 0, 0); verticalLayout= new QVBoxLayout(); verticalLayout->setObjectName(QString::fromUtf8("verticalLayout")); label= new QLabel(layoutWidget); label->setObjectName(QString::fromUtf8("label")); verticalLayout->addWidget(label); label_2= new QLabel(layoutWidget); label_2->setObjectName(QString::fromUtf8("label_2")); verticalLayout->addWidget(label_2); horizontalLayout->addLayout(verticalLayout); verticalLayout_2= new QVBoxLayout(); verticalLayout_2->setObjectName(QString::fromUtf8("verticalLayout_2")); nameEdit= new QLineEdit(layoutWidget); nameEdit->setObjectName(QString::fromUtf8("nameEdit")); verticalLayout_2->addWidget(nameEdit); numberEdit= new QLineEdit(layoutWidget); numberEdit->setObjectName(QString::fromUtf8("numberEdit")); verticalLayout_2->addWidget(numberEdit); horizontalLayout->addLayout(verticalLayout_2); QWidget::setTabOrder(nameEdit,numberEdit); QWidget::setTabOrder(numberEdit,buttonBox); retranslateUi(Dialog); QObject::connect(buttonBox,SIGNAL(accepted()), Dialog, SLOT(accept())); QObject::connect(buttonBox,SIGNAL(rejected()), Dialog, SLOT(reject())); QMetaObject::connectSlotsByName(Dialog); }// setupUi voidretranslateUi(QDialog *Dialog) { Dialog->setWindowTitle(QApplication::translate("Dialog","Dialog", 0, QApplication::UnicodeUTF8)); label->setText(QApplication::translate("Dialog","Name:", 0, QApplication::UnicodeUTF8)); label_2->setText(QApplication::translate("Dialog","Number:", 0, QApplication::UnicodeUTF8)); }// retranslateUi }; namespace Ui { class EditDialog:public Ui_EditDialog {}; } // namespace Ui QT_END_NAMESPACE #endif //UI_EDITDIALOG_H
现在编译运行就可以了
程序运行效果如图