当前位置: 首页 > article >正文

Qt 的简单示例 -- 地址簿


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

http://www.lryc.cn/news/2393509.html

相关文章:

  • Linux 下 C 语言实现工厂模式
  • 什么是DevOps的核心目标?它如何解决传统开发与运维之间的冲突?​
  • RocketMQ 死信队列(DLQ)实战:原理 + 开发 + 运维 + 架构应用指南
  • Android studio 查看aar源码出现/* compiled code */
  • 用HTML5+JavaScript实现汉字转拼音工具
  • 基于Java,SpringBoot,Vue,UniAPP医院预约挂号买药就诊病例微信小程序系统设计
  • ONNX模型的动态和静态量化
  • PHP 垃圾回收高级特性
  • OpenFeign vs MQ:微服务通信如何选型?详解同步与异步的适用场景
  • 如何用命令行将 PDF 表格转换为 HTML 表格
  • html5的响应式布局的方法示例详解
  • 如何用Python抓取Google Scholar
  • 电脑革命家测试版:硬件检测,6MB 轻量无广告 清理垃圾 + 禁用系统更新
  • Wireshark对usb设备进行抓包找不到USBPcap接口的解决方案
  • 题目 3298: 蓝桥杯2024年第十五届决赛真题-兔子集结
  • Unity开发之Webgl自动更新程序包
  • 深入理解设计模式之状态模式
  • Socket 编程 UDP
  • Jenkins实践(8):服务器A通过SSH调用服务器B执行Python自动化脚本
  • Spring AI系列之Spring AI 集成 ChromaDB 向量数据库
  • lua的注意事项2
  • 主流电商平台的反爬机制解析
  • 前端八股之HTML
  • tiktoken学习
  • 鲲鹏Arm+麒麟V10,国产化信创 K8s 离线部署保姆级教程
  • 历年厦门大学计算机保研上机真题
  • 【C++ Qt】认识Qt、Qt 项目搭建流程(图文并茂、通俗易懂)
  • IoT/HCIP实验-1/物联网开发平台实验Part2(HCIP-IoT实验手册版)
  • Replacing iptables with eBPF in Kubernetes with Cilium
  • 推荐系统排序指标:MRR、MAP和NDCG