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文件都给修改这些生成的代码。不知道怎么回事。