使用Qt实现一个简易的员工管理系统,涉及查找、添加员工。
创建
目录结构
- find.pro: 工程文件
- mainwindow.h: 窗口类头文件
- mainwindow.cpp: 窗口类源文件,主要的功能都在这里实现
- mainwindow.ui: 界面设计
界面设计
双击mainwindow.ui
,从左侧拖动组件到右侧窗口区域
常用组件:
- push button:按钮
- radio button:单选按钮
- check box:复选框
- list view:列表
- tree view:树形结构
- table view:表格
- combo box:下拉框
- edit:输入框
- label:静态文本
在右下角可以编辑每个控件的属性,其中objectName
代表控件的标识,会在代码中用到。
右键按钮,选择转到槽
,选择信号cliked()
,会在mainwindow.cpp
中自动创建一个函数,void MainWindow::on_pushButton_clicked()
。当按钮被点击时,会执行这个函数,所以说主要的功能都在mainwindow.cpp
中实现。
代码
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QStandardItemModel>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots://槽,on_pushButton_xxx_clicked函数分别相应不同的按钮点击信号
void on_pushButton_clicked();
void on_pushButton_find_clicked();
void on_pushButton_add_clicked();
private:
Ui::MainWindow *ui;
QStandardItemModel* model;
};
#endif // MAINWINDOW_H
初始化
MainWindow::MainWindow
为窗口类MainWindow的构造函数,因此可以在这里进行初始化工作。
从文件中读取数据,并加载到表格中。表格的标识objectName
在设计界面中被设为tableView
,在代码中使用ui->tableView
来调用它。创建一个model用于控制表格的数据,调用setItem(行,列,数据)
来添加数据。
查找
ui->textEdit_id->toPlainText()
:获取输入框textEdit_id
的文本,
ui->tableView->model()->rowCount()
:获取行数,通过for循环遍历每一行数据与输入的id进行比较,找到后通过setText
将姓名和性别输入框设置为查找到的数据。未找到则创建一个消息框QMessageBox提示未找到。
添加
获取行数,在新的一行调用model的setItem添加数据
qDebug
:将数据输出到控制台而不是窗口界面,便于调试
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
/*
QString fileName = QFileDialog::getOpenFileName(this, "open file", "/Users/zforw"); //创建文件对话框手动选择文件
if(fileName.isEmpty() == true){
QMessageBox::warning(this, "warning", "选择文件无效");
return;
}
QFile file(fileName);
*/
//创建文件对象
QFile file("/Users/zforw/Downloads/emp.txt");
//指定打开方式 open
bool isOk = file.open(QFile::ReadWrite);//以读写方式打开,可以only read,only write
if(isOk == false){
QMessageBox::critical(this, "critical", "打开文件失败");
return;
}
model = new QStandardItemModel(ui->tableView);
int i = 0;
while(!file.atEnd())
{
QString string = file.readLine();
QStringList strList = string.split(" ");
strList[2].replace(QString("\n"), QString(""));
qDebug() << strList[0] << "," << strList[1] << "," << strList[2];
model->setItem(i, 0, new QStandardItem(strList[0]));
model->setItem(i, 1, new QStandardItem(strList[1]));
model->setItem(i, 2, new QStandardItem(strList[2]));
ui->tableView->setModel(model);
i++;
}
file.close();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked() {}
void MainWindow::on_pushButton_find_clicked()
{
QString id = ui->textEdit_id->toPlainText();
//int i = id.toInt();
int rows = ui->tableView->model()->rowCount();
for(int r = 0; r < rows; r++)
{
if(ui->tableView->model()->index(r,0).data().toString() == id) {
qDebug() << r;
ui->textEdit_name->setText(ui->tableView->model()->index(r,1).data().toString());
ui->textEdit_gender->setText(ui->tableView->model()->index(r,2).data().toString());
return;
}
}
QMessageBox msg(this);
msg.setText("未找到");
msg.exec();
}
void MainWindow::on_pushButton_add_clicked()
{
int rows = ui->tableView->model()->rowCount();
qDebug() << rows;
model->setItem(rows, 0, new QStandardItem(ui->textEdit_id->toPlainText()));
model->setItem(rows, 1, new QStandardItem(ui->textEdit_name->toPlainText()));
model->setItem(rows, 2, new QStandardItem(ui->textEdit_gender->toPlainText()));
ui->tableView->setModel(model);
}
运行
数据
初始
查找
添加
设置列名
model->setColumnCount(3);
model->setHeaderData(0,Qt::Horizontal, "工号");
model->setHeaderData(1,Qt::Horizontal, "姓名");
model->setHeaderData(2,Qt::Horizontal, "性别");
其他
常用类型:QString、QVector、QQueue、QList …
作图:QPen、QPoint、QPainter、QBrush
通过在需要的代码中调用update();
来调用paintEvent()
绘画。
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPen redPen, blackPen, bluePen;
blackPen.setWidth(2);//设置线宽
blackPen.setColor(Qt::black);
//pen.setColor(Qt::red);//设置为红色
//pen.setColor(QColor(150,25,96));//使用RGB设置颜色
painter.setPen(redPen);
painter.drawLine(QPoint_xxx, QPoint_xxx);
painter.drawRect(50,50,200,100);
}