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

posted @ 2011-06-12 16:26  xfate  阅读(669)  评论(0编辑  收藏  举报