Qt学习笔记2--员工管理小系统的问题记录

Qt学习笔记

最近有个Oracle的课程设计,是个员工管理小系统,代码量比较小,所以决定用Qt来写,之前也没学过Qt,花了几天,边学边做,做了出来,其中遇到些问题和知识点,记了下来。

clip_image002

clip_image004

clip_image006

Qt使用Oracle,要先编译。

clip_image008

1.登录:

聚焦和密码模式

1 ui . userLineEdit - > setFocus();
2
3 ui . pwdlineEdit - > setEchoMode   (QLineEdit : : Password);
4
5
2.其中一种提示框:
1 QMessageBox : : critical( 0 , 0 ,QObject : : tr( " 用户名或密码错误 " ));

3.禁止最大化:

1 flags   | =   Qt : : WindowMinimizeButtonHint;
2
3 setWindowFlags(flags);
4
5
4.显示和限制图片尺寸
1 ui . label - > setPixmap(QPixmap(QString : : fromUtf8( " Resources/images/login.png " )) . scaled( 681 , 86 ,   Qt : : KeepAspectRatio));

5.点击按钮弹出对话框:

connect(ui . addEmployBtn,SIGNAL(clicked()), this ,SLOT(addEmployee()));

void   Staff : : addEmployee()

{

AddEmployee   em;

em . show();
10
11 em . exec();
12
13 }
14
15
也可以用on_modifyEmployBtn_clicked这些私有槽来省略连接信号和槽这句话。

6.数据库方面的操作:

6.1基本操作

QSqlQuery   query;

QString   str1   =   " select   *   from   Manager   where   UserName   =' " + ui . userLineEdit - > text() + " '   and   pwd   =' " + ui . pwdlineEdit - > text() + " ' " ;

query . prepare(str1);

query . exec();

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存储过程

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) " ;

query . prepare(str);

query . bindValue( " :P_EmployJoinData " ,QString : : number(ui . joinDEdit - > date() . year()));

query . bindValue( " :P_EmployeeName " ,ui . userlineEdit - > text());

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显示

model   =   new   QSqlQueryModel( this );

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 " ;

model - > setQuery(selectstr);

model - > setHeaderData( 0 ,   Qt : : Horizontal,   tr( " 员工编号 " ));

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知道选中的是哪一行

void   Staff : : on_modifyEmployBtn_clicked()

{

int   curRow   =   ui . employtableView - > currentIndex() . row();

QString   id   =   model - > data(model - > index(curRow, 0 )) . toString();

ModifyEmployee   * md   =   new   ModifyEmployee();
10
11 md - > show();
12
13 md - > initData(id);
14
15 }
16
17
7.添加图片

QString   filepath   =   QFileDialog : : getOpenFileName( 0 ,QString(),QString(),tr( " Images(*.png   *.jpg   *.gif) " ));

QImage   image;

if ( ! image . load(filepath))

{

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.分离文件路径和文件名

1 int   i   =   filepath . lastIndexOf( " / " );
2
3 filename =   filepath . right(filepath . length()   -   i   -   1 );
4
5 filep   =   filepath . left(i + 1 );
6
7
9.单继承

class   AddEmployee : public   QDialog

{

Q_OBJECT // 不要忘了加这个

public :

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.判断警告框点击的是确定还是取消

QMessageBox : : StandardButton   rb   = QMessageBox : : warning( 0 ,tr( " 删除 " ),tr( " 你确定要删除这条记录吗 " ),QMessageBox : : Ok | QMessageBox : : Cancel,QMessageBox : : Cancel);

if (rb   = =   QMessageBox : : Cancel)

{

return ;

}
10
11
11.Oracle 插入Blob字段

在Qt里把图转换为2进制传到插入存储过程里,执行的话,只能插入一些小图,大图片插不了。不知道为什么,没办法之下,所以用oracle建立目录来插入blob字段。

create   or   replace   procedure   proInsertEmployee (

P_EmployJoinData   varchar2 , /* 加入部门时间 */

P_EmployeeName   varchar2   , /* 姓名 */

P_DepartmentNo   char , /* 所属部门 */

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文件,

这些ui文件生成的代码:类名都是QDialog,而不是类似AddEmployClass之类的名字,每次改下ui文件都给修改这些生成的代码。不知道怎么回事。

转载于:https://www.cnblogs.com/xfate/archive/2011/06/12/2078919.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值