这个工程里有两个窗口,都是QWidget派生的窗口
主窗口:
1. 运用了布局,按钮控件,单行编辑框,富文本编辑框等窗口部件;
2. 运用了 QMap 类;
3. 实现了点击按钮弹出子窗口的功能,这里子窗口设置为了模态窗口
这样窗口弹出后会阻塞父窗口;
子窗口:
1. 子窗口定义时接收传递进来的QMap的参数对自己的 QMap 变量进行初始化
2. 运用了窗口部件 QTableWidget
/** addressbook.h 文件 **/
#ifndef ADDRESSBOOK_H
#define ADDRESSBOOK_H
#include <QWidget>
#include <QLineEdit>
#include <QTextEdit>
#include <QLabel>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QPushButton>
#include <QMessageBox>
class AddressBook : public QWidget
{
Q_OBJECT
public:
explicit AddressBook(QWidget *parent = nullptr);
private:
QLineEdit *nameLine;
QTextEdit *addressText;
QPushButton *showButton;
QPushButton *addButton;
QPushButton *submitButton;
QPushButton *cancelButton;
QMap<QString,QString>contacts; //键值对
QString oldName;
QString oldAddress;
signals:
public slots:
void addContact();
void submitContact();
void cancel();
void showList();
};
#endif // ADDRESSBOOK_H
/** addressbook.cpp **/
#include "addressbook.h"
#include "addresslist.h"
AddressBook::AddressBook(QWidget *parent) : QWidget(parent)
{
QLabel *nameLabel = new QLabel(tr("Name:"));
nameLine = new QLineEdit;
nameLine->setReadOnly(true);
QLabel *addressLabel = new QLabel(tr("Address:"));
addressText = new QTextEdit;
addressText->setReadOnly(true);
showButton= new QPushButton(tr("Show"));
//网格布局
QGridLayout *mainLayout = new QGridLayout;
mainLayout->addWidget(nameLabel,0,0);
mainLayout->addWidget(nameLine,0,1);
mainLayout->addWidget(showButton,0,2);
mainLayout->addWidget(addressLabel,1,0,Qt::AlignTop);
mainLayout->addWidget(addressText,1,1);
//定义按钮
addButton = new QPushButton(tr("&Add"));
addButton->show();
submitButton = new QPushButton(tr("&Submit"));
submitButton->hide();
cancelButton = new QPushButton(tr("&Cancel"));
cancelButton->hide();
//给按钮的点击信号添加槽函数
connect(addButton,SIGNAL(clicked()),this,SLOT(addContact()));
connect(submitButton,SIGNAL(clicked()),this,SLOT(submitContact()));
connect(cancelButton,SIGNAL(clicked()),this,SLOT(cancel()));
connect(showButton,SIGNAL(clicked()),this,SLOT(showList()));
//按钮添加到布局
QVBoxLayout *buttonLayout=new QVBoxLayout;
buttonLayout->addWidget(addButton,Qt::AlignTop);
buttonLayout->addWidget(submitButton);
buttonLayout->addWidget(cancelButton);
buttonLayout->addStretch();//添加拉伸,可以使部件排列紧密些
//将按钮布局添加到主布局中
mainLayout->addLayout(buttonLayout,1,2);
setLayout(mainLayout);
setWindowTitle(tr("Simple Address Book"));
}
//按钮相关槽函数实现
void AddressBook::addContact(){
//先记录最后一个通讯录
oldName = nameLine->text();
oldAddress = addressText->toPlainText(); //转换为纯文本
//情况显示
nameLine->clear();
addressText->clear();
nameLine->setReadOnly(false);
nameLine->setFocus(Qt::OtherFocusReason); //控件设置焦点
addressText->setReadOnly(false);
addButton->setEnabled(false); // 按钮设置为不可点
submitButton->show();
cancelButton->show();
}
void AddressBook::submitContact(){
QString name = nameLine->text();
QString address = addressText->toPlainText();
//判断是否为空
if(name == "" || address == ""){
QMessageBox::information(this,tr("Empty Field"),
tr("Please enter a name and address."));
return;
}
//判断联系人是否已存在
if(!contacts.contains(name)){
contacts.insert(name,address);
QMessageBox::information(this,tr("Add Successful."),
tr("\"%1\"has been added to your address book.").arg(name));
}else {
QMessageBox::information(this,tr("Add Unsuccessful!"),
tr("Sorry,\"%1\"has been added to your address book.").arg(name));
return;
}
//如果列表是空
if(contacts.isEmpty()){
nameLine->clear();
addressText->clear();
}
nameLine->setReadOnly(true);
addressText->setReadOnly(true);
addButton->setEnabled(true);
submitButton->hide();
cancelButton->hide();
}
void AddressBook::cancel(){
nameLine->setText(oldName);
nameLine->setReadOnly(true);
addressText->setText(oldAddress);
addressText->setReadOnly(true);
addButton->setEnabled(true);
submitButton->hide();
cancelButton->hide();
}
void AddressBook::showList(){
AddressList *addrlist = new AddressList(contacts);
addrlist->setWindowModality(Qt::ApplicationModal);
addrlist->show();
addrlist->setAttribute(Qt::WA_DeleteOnClose);
}
/** addresslist.cpp **/
#include "addresslist.h"
AddressList::AddressList(const QMap<QString, QString> &initMap,QWidget *parent)
: QWidget(parent),
addressMap(initMap)
{
addressList = new QTableWidget(100,3);
addressList->setHorizontalHeaderLabels({"number","name","address"});
QVBoxLayout *mainLayout = new QVBoxLayout;
setLayout(mainLayout);
mainLayout->addWidget(addressList,Qt::AlignCenter);
showAddressList();
setWindowTitle(tr("Address List"));
}
void AddressList::showAddressList(){
int i=0;
for(auto it = addressMap.begin();it != addressMap.end();++it){
addressList->setItem(i,0,new QTableWidgetItem(tr("%1").arg(i+1)));
addressList->setItem(i,1,new QTableWidgetItem(it.key()));
addressList->setItem(i,2,new QTableWidgetItem(it.value()));
i++;
}
}
/** main.cpp **/
#include "addressbook.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
AddressBook addressBook;
addressBook.show();
return a.exec();
}