Qt学习笔记2--员工管理小系统的问题记录
Qt学习笔记
最近有个Oracle的课程设计,是个员工管理小系统,代码量比较小,所以决定用Qt来写,之前也没学过Qt,花了几天,边学边做,做了出来,其中遇到些问题和知识点,记了下来。
Qt使用Oracle,要先编译。
1.登录:
聚焦和密码模式
1 ui.userLineEdit->setFocus();
2
3 ui.pwdlineEdit->setEchoMode (QLineEdit::Password);
4
5
2.其中一种提示框: 2
3 ui.pwdlineEdit->setEchoMode (QLineEdit::Password);
4
5
1 QMessageBox::critical(0,0,QObject::tr("用户名或密码错误"));
3.禁止最大化:
1 flags |= Qt::WindowMinimizeButtonHint;
2
3 setWindowFlags(flags);
4
5
4.显示和限制图片尺寸 2
3 setWindowFlags(flags);
4
5
1 ui.label->setPixmap(QPixmap(QString::fromUtf8("Resources/images/login.png")).scaled(681,86, Qt::KeepAspectRatio));
5.点击按钮弹出对话框:
1 connect(ui.addEmployBtn,SIGNAL(clicked()),this,SLOT(addEmployee()));
2
3 void Staff::addEmployee()
4
5 {
6
7 AddEmployee em;
8
9 em.show();
10
11 em.exec();
12
13 }
14
15
也可以用on_modifyEmployBtn_clicked这些私有槽来省略连接信号和槽这句话。 2
3 void Staff::addEmployee()
4
5 {
6
7 AddEmployee em;
8
9 em.show();
10
11 em.exec();
12
13 }
14
15
6.数据库方面的操作:
6.1基本操作
1 QSqlQuery query;
2
3 QString str1 = "select * from Manager where UserName ='"+ui.userLineEdit->text()+"' and pwd ='"+ui.pwdlineEdit->text()+"'";
4
5 query.prepare(str1);
6
7 query.exec();
8
9 query.next();
10
11 =============================
12
13 QString str ="select * from department where departmentno ='"+id+"'";
14
15 QSqlQuery query;
16
17 query.exec(str);
18
19 query.next();
20
21 ui.nameLineEdit->setText(query.value(1).toString());
query.next()必须存在。
6.2 调用Oracle存储过程 2
3 QString str1 = "select * from Manager where UserName ='"+ui.userLineEdit->text()+"' and pwd ='"+ui.pwdlineEdit->text()+"'";
4
5 query.prepare(str1);
6
7 query.exec();
8
9 query.next();
10
11 =============================
12
13 QString str ="select * from department where departmentno ='"+id+"'";
14
15 QSqlQuery query;
16
17 query.exec(str);
18
19 query.next();
20
21 ui.nameLineEdit->setText(query.value(1).toString());
query.next()必须存在。
1 QString str = "CALL proInsertEmployee(:P_EmployJoinData,:P_EmployeeName,:P_DepartmentNo,:P_sex,:P_EmployeeDate,:P_WorkDate,:P_NationNo,:P_PostNo,:P_EmployeeMemo,:P_EmployeeImage,:P_filePath)";
2
3 query.prepare(str);
4
5 query.bindValue(":P_EmployJoinData",QString::number(ui.joinDEdit->date().year()));
6
7 query.bindValue(":P_EmployeeName",ui.userlineEdit->text());
8
9 query.bindValue(":P_DepartmentNo",departid);
10
11 query.bindValue(":P_sex",ui.sexCBox->currentText());
12
13 query.bindValue(":P_EmployeeDate",ui.birthdateDEdit->date());
14
15 query.bindValue(":P_WorkDate",ui.joinDEdit->date());
16
17 query.bindValue(":P_NationNo",nationid);
18
19 query.bindValue(":P_PostNo",postid);
20
21 query.bindValue(":P_EmployeeMemo",ui.resumeText->toPlainText());
22
23 query.bindValue(":P_EmployeeImage",filename);
24
25 query.bindValue(":P_filePath","'"+filep+"'");
26
27 query.exec();
28
29 if(query.lastError().isValid())
30
31 {
32
33 qDebug()<<query.lastError();
34
35 }
36
37 else
38
39 {
40
41 QMessageBox::information(0,QObject::tr("提示"),QObject::tr("添加成功"));
42
43 hide();
44
45 st->initData();
46
47 }
48
49
6.3 table显示 2
3 query.prepare(str);
4
5 query.bindValue(":P_EmployJoinData",QString::number(ui.joinDEdit->date().year()));
6
7 query.bindValue(":P_EmployeeName",ui.userlineEdit->text());
8
9 query.bindValue(":P_DepartmentNo",departid);
10
11 query.bindValue(":P_sex",ui.sexCBox->currentText());
12
13 query.bindValue(":P_EmployeeDate",ui.birthdateDEdit->date());
14
15 query.bindValue(":P_WorkDate",ui.joinDEdit->date());
16
17 query.bindValue(":P_NationNo",nationid);
18
19 query.bindValue(":P_PostNo",postid);
20
21 query.bindValue(":P_EmployeeMemo",ui.resumeText->toPlainText());
22
23 query.bindValue(":P_EmployeeImage",filename);
24
25 query.bindValue(":P_filePath","'"+filep+"'");
26
27 query.exec();
28
29 if(query.lastError().isValid())
30
31 {
32
33 qDebug()<<query.lastError();
34
35 }
36
37 else
38
39 {
40
41 QMessageBox::information(0,QObject::tr("提示"),QObject::tr("添加成功"));
42
43 hide();
44
45 st->initData();
46
47 }
48
49
1 model = new QSqlQueryModel(this);
2
3 String selectstr="select EmployeeNo,EmployeeName,Departmentname,sex,employeedate,workdate,Nationname,PostName from employee,department,DCNation,DCPost where employee.departmentno = department.departmentno and DCNation.Nationno = employee.nationno and employee.postno = DCPost.Postno";
4
5 model->setQuery(selectstr);
6
7 model->setHeaderData(0, Qt::Horizontal, tr("员工编号"));
8
9 model->setHeaderData(1, Qt::Horizontal, tr("员工姓名"));
10
11 model->setHeaderData(2, Qt::Horizontal, tr("部门名称"));
12
13 model->setHeaderData(3, Qt::Horizontal, tr("性别"));
14
15 model->setHeaderData(4, Qt::Horizontal, tr("出生年月"));
16
17 model->setHeaderData(5, Qt::Horizontal, tr("入职时间"));
18
19 model->setHeaderData(6, Qt::Horizontal, tr("民族"));
20
21 model->setHeaderData(7, Qt::Horizontal, tr("岗位"));
22
23 ui.employtableView->setModel(model);
24
25 ui.employtableView->setSelectionMode(QAbstractItemView::SingleSelection);
26
27 ui.employtableView->setSelectionBehavior(QAbstractItemView::SelectRows);
28
29 ui.employtableView->show();
30
31
6.4 tableview知道选中的是哪一行 2
3 String selectstr="select EmployeeNo,EmployeeName,Departmentname,sex,employeedate,workdate,Nationname,PostName from employee,department,DCNation,DCPost where employee.departmentno = department.departmentno and DCNation.Nationno = employee.nationno and employee.postno = DCPost.Postno";
4
5 model->setQuery(selectstr);
6
7 model->setHeaderData(0, Qt::Horizontal, tr("员工编号"));
8
9 model->setHeaderData(1, Qt::Horizontal, tr("员工姓名"));
10
11 model->setHeaderData(2, Qt::Horizontal, tr("部门名称"));
12
13 model->setHeaderData(3, Qt::Horizontal, tr("性别"));
14
15 model->setHeaderData(4, Qt::Horizontal, tr("出生年月"));
16
17 model->setHeaderData(5, Qt::Horizontal, tr("入职时间"));
18
19 model->setHeaderData(6, Qt::Horizontal, tr("民族"));
20
21 model->setHeaderData(7, Qt::Horizontal, tr("岗位"));
22
23 ui.employtableView->setModel(model);
24
25 ui.employtableView->setSelectionMode(QAbstractItemView::SingleSelection);
26
27 ui.employtableView->setSelectionBehavior(QAbstractItemView::SelectRows);
28
29 ui.employtableView->show();
30
31
1 void Staff::on_modifyEmployBtn_clicked()
2
3 {
4
5 int curRow = ui.employtableView->currentIndex().row();
6
7 QString id = model->data(model->index(curRow,0)).toString();
8
9 ModifyEmployee *md = new ModifyEmployee();
10
11 md->show();
12
13 md->initData(id);
14
15 }
16
17
7.添加图片 2
3 {
4
5 int curRow = ui.employtableView->currentIndex().row();
6
7 QString id = model->data(model->index(curRow,0)).toString();
8
9 ModifyEmployee *md = new ModifyEmployee();
10
11 md->show();
12
13 md->initData(id);
14
15 }
16
17
1 QString filepath = QFileDialog::getOpenFileName(0,QString(),QString(),tr("Images(*.png *.jpg *.gif)"));
2
3 QImage image;
4
5 if(!image.load(filepath))
6
7 {
8
9 QMessageBox::critical(0,QObject::tr("警告"),QObject::tr("你选择的不是照片"));
10
11 return;
12
13 }
14
15 QPixmap pixmap(QPixmap::fromImage(image));
16
17 QPixmap fitpixmap=pixmap.scaled(114,156, Qt::KeepAspectRatio);
18
19
8.分离文件路径和文件名 2
3 QImage image;
4
5 if(!image.load(filepath))
6
7 {
8
9 QMessageBox::critical(0,QObject::tr("警告"),QObject::tr("你选择的不是照片"));
10
11 return;
12
13 }
14
15 QPixmap pixmap(QPixmap::fromImage(image));
16
17 QPixmap fitpixmap=pixmap.scaled(114,156, Qt::KeepAspectRatio);
18
19
1 int i = filepath.lastIndexOf("/");
2
3 filename= filepath.right(filepath.length() - i - 1);
4
5 filep = filepath.left(i+1);
6
7
9.单继承 2
3 filename= filepath.right(filepath.length() - i - 1);
4
5 filep = filepath.left(i+1);
6
7
1 class AddEmployee:public QDialog
2
3 {
4
5 Q_OBJECT//不要忘了加这个
6
7 public:
8
9 AddEmployee(QWidget * parent = 0);
10
11 ~AddEmployee();
12
13 private:
14
15 Ui::AddEmployClass ui;
16
17 QString filename;
18
19 QString filep;
20
21 private slots:
22
23 void addImage();
24
25 void submit();
26
27 };
28
29
10.判断警告框点击的是确定还是取消 2
3 {
4
5 Q_OBJECT//不要忘了加这个
6
7 public:
8
9 AddEmployee(QWidget * parent = 0);
10
11 ~AddEmployee();
12
13 private:
14
15 Ui::AddEmployClass ui;
16
17 QString filename;
18
19 QString filep;
20
21 private slots:
22
23 void addImage();
24
25 void submit();
26
27 };
28
29
1 QMessageBox::StandardButton rb =QMessageBox::warning(0,tr("删除"),tr("你确定要删除这条记录吗"),QMessageBox::Ok|QMessageBox::Cancel,QMessageBox::Cancel);
2
3 if(rb == QMessageBox::Cancel)
4
5 {
6
7 return;
8
9 }
10
11
11.Oracle 插入Blob字段 2
3 if(rb == QMessageBox::Cancel)
4
5 {
6
7 return;
8
9 }
10
11
在Qt里把图转换为2进制传到插入存储过程里,执行的话,只能插入一些小图,大图片插不了。不知道为什么,没办法之下,所以用oracle建立目录来插入blob字段。
1 create or replace procedure proInsertEmployee(
2
3 P_EmployJoinData varchar2,/*加入部门时间*/
4
5 P_EmployeeName varchar2 ,/*姓名*/
6
7 P_DepartmentNo char,/*所属部门*/
8
9 P_sex char,/*性别*/
10
11 P_EmployeeDate date,/*出生日期*/
12
13 P_WorkDate date,/*工作日期*/
14
15 P_NationNo char ,/*民族*/
16
17 P_PostNo char,/*岗位*/
18
19 P_EmployeeMemo varchar2,/*简历*/
20
21 P_EmployeeImage varchar2,/*照片*/
22
23 P_filePath varchar2
24
25 )as
26
27 employ_No varchar(8);
28
29 v_sql varchar(500);
30
31 F_LOB BFILE; --文件类型
32
33 B_LOB BLOB;
34
35 begin
36
37 --创建目录
38
39 v_sql := 'create or replace directory IMAGES as '||P_filePath;
40
41 execute immediate v_sql;
42
43 --产生主键号
44
45 employ_No:=funemployeeno(P_EmployJoinData);
46
47 insert into Employee(EmployeeNo,EmployeeName,DepartmentNo,
48
49 sex,EmployeeDate,WorkDate,NationNo,PostNo) values(employ_No,
50
51 P_EmployeeName,P_DepartmentNo, P_sex,
52
53 P_EmployeeDate,P_WorkDate,P_NationNo,P_PostNo);
54
55 insert into EmployeeOther(employeeno,employeeMemo,employeeImage) values(employ_No,P_EmployeeMemo,empty_blob()) return
56
57 employeeImage INTO B_LOB;
58
59 --获取指定目录下的文件
60
61 F_LOB := BFILENAME('IMAGES', P_EmployeeImage);
62
63 --以只读的方式打开文件
64
65 DBMS_LOB.FILEOPEN(F_LOB, DBMS_LOB.FILE_READONLY);
66
67 --传递对象
68
69 DBMS_LOB.LOADFROMFILE(B_LOB, F_LOB, DBMS_LOB.GETLENGTH(F_LOB));
70
71 --关闭原始文件
72
73 DBMS_LOB.FILECLOSE(F_LOB);
74
75 exception
76
77 when others then
78
79 rollback;
80
81 commit;
82
83 end proInsertEmployee;
84
85
12.还有一个问题,无法解决,很郁闷,在vs2008调用Qt designer 生成的ui文件,我再添加vs的ui目录里,一编译就出问题,比如建几个QDialog对话框的ui文件, 2
3 P_EmployJoinData varchar2,/*加入部门时间*/
4
5 P_EmployeeName varchar2 ,/*姓名*/
6
7 P_DepartmentNo char,/*所属部门*/
8
9 P_sex char,/*性别*/
10
11 P_EmployeeDate date,/*出生日期*/
12
13 P_WorkDate date,/*工作日期*/
14
15 P_NationNo char ,/*民族*/
16
17 P_PostNo char,/*岗位*/
18
19 P_EmployeeMemo varchar2,/*简历*/
20
21 P_EmployeeImage varchar2,/*照片*/
22
23 P_filePath varchar2
24
25 )as
26
27 employ_No varchar(8);
28
29 v_sql varchar(500);
30
31 F_LOB BFILE; --文件类型
32
33 B_LOB BLOB;
34
35 begin
36
37 --创建目录
38
39 v_sql := 'create or replace directory IMAGES as '||P_filePath;
40
41 execute immediate v_sql;
42
43 --产生主键号
44
45 employ_No:=funemployeeno(P_EmployJoinData);
46
47 insert into Employee(EmployeeNo,EmployeeName,DepartmentNo,
48
49 sex,EmployeeDate,WorkDate,NationNo,PostNo) values(employ_No,
50
51 P_EmployeeName,P_DepartmentNo, P_sex,
52
53 P_EmployeeDate,P_WorkDate,P_NationNo,P_PostNo);
54
55 insert into EmployeeOther(employeeno,employeeMemo,employeeImage) values(employ_No,P_EmployeeMemo,empty_blob()) return
56
57 employeeImage INTO B_LOB;
58
59 --获取指定目录下的文件
60
61 F_LOB := BFILENAME('IMAGES', P_EmployeeImage);
62
63 --以只读的方式打开文件
64
65 DBMS_LOB.FILEOPEN(F_LOB, DBMS_LOB.FILE_READONLY);
66
67 --传递对象
68
69 DBMS_LOB.LOADFROMFILE(B_LOB, F_LOB, DBMS_LOB.GETLENGTH(F_LOB));
70
71 --关闭原始文件
72
73 DBMS_LOB.FILECLOSE(F_LOB);
74
75 exception
76
77 when others then
78
79 rollback;
80
81 commit;
82
83 end proInsertEmployee;
84
85
这些ui文件生成的代码:类名都是QDialog,而不是类似AddEmployClass之类的名字,每次改下ui文件都给修改这些生成的代码。不知道怎么回事。