Qt 的简单示例 -- 地址簿

发布于:2025-05-29 ⋅ 阅读:(25) ⋅ 点赞:(0)


这个工程里有两个窗口,都是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();
}


网站公告

今日签到

点亮在社区的每一天
去签到