(转自:http://blog.chinaunix.net/uid-25799257-id-600157.html)
引言 最近在做数据库相关课程设计,所以就借此机会,先熟悉一下Qt的一些编程,同时了解一下C++的一些特性。其实更重要的是如何组织好相关模块的连接,如何规划项目,等等。所以就顺道把过程中遇到的问题和重要的一些控件的槽和信号介绍一下,以后忘了可以回来看。呵呵。
以下是我用到的一些重要的函数和代码:
一、数据库的连接
1.QSqlDatabase TB = QSqlDatabase::addDatabase("QMYSQL");// becomes the new default connect
//TB.setConnectOptions("CLIENT_SSL=1;CLIENT_IGNORE_SPACE=1");//使用SSL安全连接
TB.setHostName("127.0.0.1");//主机名
TB.setDatabaseName("chat");//数据库名
//TB.setPort(3306);//端口号
TB.setUserName("root");//用户名
TB.setPassword("123");//密码
2.数据的避免无法处理和插入汉字问题
create database chat character set GBK;//这样建立数据库就可以插入中文或者其它办法 use chat; --查看数据库的字符集 show variables like 'character\_set\_%'; show variables like 'collation_%'; --设置数据库字符编码 set names 'GBK' --这样的话在consle端口查看不会是乱码 --drop table xxxx; --修改系列 --增加Head属性 alter table tb_user add Head varchar(20); --删除数据 delete from tb_userRS where friendID = "107865437"; --更新属性 update tb_user set username="淼的世界" where id="642419907";
二、应用程序汉字处理(黑代码)
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));//字体处理
三、设定整个对话框的背景颜色(黑代码)
this->setAutoFillBackground(true);//1s step
QPalette palette;//2s step
palette.setBrush(QPalette::Background, QBrush(QPixmap("image/login.JPG")));
this->setPalette(palette);//3s step
四、应用程序图标设计
图标设计的时候,我们要把.ico文件放在工程的ico目录下,或者其它目录也行。然后在该图标目录下建立一个后缀为.rc的文件,内容如下,IDI_ICON1 ICON DISCARDABLE "cool.ico" ,就样在程序中如此调用:this->setWindowIcon(QIcon("ico/cool.ico"));//设置程序ico图标,注意要在.pro做设置,OK。
五、应用程序enter快捷键事件的实现
1.在头文件中定义一个快捷键 QShortcut *key_enter_login;//快捷键登录
2.定义相应的槽 private slots:
void enter_longin();
3.构造函数中
key_enter_login = new QShortcut(QKeySequence(tr("Return")), this);//设置Enter快捷键,但是Enter不行,用Return就行。
connect(key_enter_login, SIGNAL(activated()), this, SLOT(enter_longin()));
六、文字链接到网页
构造函数中:
QLabel *m_r_acount = new QLabel(this); m_r_acount->setText(tr("<a href=\"http://www.yafeilinux.com\">注册帐号 "));
connect(m_r_acount, SIGNAL(linkActivated(QString)), this, SLOT(openUrl(const QString)));
槽中(不要忘了头文件申明槽)
void MyFirstQQ::openUrl(const QString ®ister_url)
{ QDesktopServices::openUrl(QUrl("http://localhost:8080/chat/register.jsp"));
}
六、QComboBox的设置
QComboBox *m_a_choice = new QComboBox(this);
QStringList C_strings;
C_strings <<"666666"<< "642419907" << "767938089" << "107865437" << "110120119" ;
completer = new QCompleter(C_strings, this);//可以进行匹配的哦
m_a_choice->clear();
m_a_choice->addItems(C_strings);
m_a_choice->setMaxVisibleItems(7);//设置最大显示下列项 超过要使用滚动条拖拉
m_a_choice->setEditable(true);
m_a_choice->setCompleter(completer);
六、鼠标滑过事件
头文件中:
protected:
void mouseMoveEvent(QMouseEvent *event);//鼠标滑动
构造函数中:
//设定鼠标跟踪事件 this->setMouseTracking(true); //标签跟踪 qlabel->setMouseTracking(true);//还可以设置其它控件
实现函数中:(举个小例子)
int x = event->x(); int y = event->y(); if(x > u_b_x && x < u_b_x+u_b_width && y > u_b_y && y < u_b_y+u_b_height) { u_background->setPixmap(QPixmap("image/skin3.JPG")); } else if(x > u_button_x && x < u_button_x+u_button_width && y > u_button_y && y < u_button_y+u_button_height) { textbox.show(); } else{ u_background->setPixmap(QPixmap("image/skin.JPG")); textbox.close(); }
六、重写标签鼠标点击事件的实现(需要重写QLabel,构造自己的QLabel->MyLabel)
#ifndef CLICKEDLABEL_H_ #define CLICKEDLABEL_H_ #include <QtGui> class ClickedLabel : public QLabel //继承QLabel,重写事件,实现点击标签退出 { Q_OBJECT public: ClickedLabel(QWidget *parent = 0); int MyLabelPressed; void mousePressEvent(QMouseEvent *e);//添加鼠标响应事件 void mouseReleaseEvent(QMouseEvent *e); signals: void clicked();//点击信号 }; #endif /* CLICKEDLABEL_H_ */
#include "ClickedLabel.h" ClickedLabel::ClickedLabel(QWidget *parent) :QLabel(parent) { MyLabelPressed = 0; } void ClickedLabel::mousePressEvent ( QMouseEvent * e ) { MyLabelPressed = 1; } void ClickedLabel::mouseReleaseEvent ( QMouseEvent * e ) { if (MyLabelPressed) { emit clicked(); MyLabelPressed = 0; } }
实使用的时候,只要包括该头文件,然后用ClickedLabel定义一个这样的标签,那么在如下使用信号和槽:
ClickedLabel *s_exit;//退出标签,这样就可以使用clicked()信号了
connect(s_exit, SIGNAL(clicked()), this, SLOT(closed()));
七、重写QListWidget鼠标右击弹出菜单事件。(该实现需要重写QListWidget)
#ifndef LISTWIDGET_H_ #define LISTWIDGET_H_ #include<QApplication> #include<QWidget> #include<QListWidget> #include<QMenu> #include<QAction> #include "scaninfo.h" #include "addfriend.h" class ListWidget : public QListWidget { Q_OBJECT public: explicit ListWidget(QWidget *parent = 0);//explicit构造函数只能被显示调用 void contextMenuEvent ( QContextMenuEvent * event ); private: QAction *action;//删除选项 QAction *scan_action;//查看资料 QAction *add_friend;//添加好友 QMenu *popMenu; }; #endif /* LISTWIDGET_H_ */
#include "ListWidget.h"
#include<QMessageBox>
ListWidget::ListWidget(QWidget *parent):
QListWidget(parent)
{
action = new QAction(QIcon("image/delete.jpg"),tr("删除好友"),this); //删除事件
scan_action = new QAction(QIcon("image/scan.jpg"),tr("查看资料"),this);
add_friend = new QAction(QIcon("image/addFriend.jpg"),tr("添加好友"),this);
popMenu = new QMenu(this);
}
void ListWidget::contextMenuEvent ( QContextMenuEvent * event )
{
if(this->itemAt(mapFromGlobal(QCursor::pos())) != NULL) //如果有item则选中
{
itemAt(mapFromGlobal(QCursor::pos()))->setSelected(true);
}
else
{
popMenu->addAction(add_friend);
popMenu->removeAction(action);
popMenu->removeAction(scan_action);
popMenu->exec(QCursor::pos());
}
if(this->itemAt(mapFromGlobal(QCursor::pos())) != NULL) //如果有item则添加"删除"菜单
{
popMenu->addAction(action);
popMenu->addAction(scan_action);
popMenu->removeAction(add_friend);
popMenu->exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置
}
}
使用的时候在你需要的类中(头文件或者构造函数):ListWidget u_good_Widget = new ListWidget(this);就行
七、类似于QQ那种伸缩列表的小效果,自己可以参考
1.申明该QListWidget的相关槽
connect(u_good_Widget, SIGNAL(clicked(QModelIndex)), this, SLOT(good_Stretch(QModelIndex)));
2.槽实现
void UserQQ::good_Stretch(QModelIndex index) { if(u_flag){ u_item->setIcon(QIcon(QPixmap("image/QListWidgetItemUp.png"))); } else
{ u_item->setIcon((QPixmap("image/QListWidgetItemDown.png"))); } if(index.row()==0){ for(int j = 1; j < u_hide_count+1; j++) { u_good_Widget->setRowHidden(j, u_flag); } u_flag = !u_flag; //这里不要这样做u_flag = false;结果也出乎意料 } }
七、QMenu中QAction的事件定义
QMenu *cmenu = NULL;//定义并初始化右键 cmenu = new QMenu(this);//初始化右键在何处显示 QAction *EnterGroupTalk = cmenu->addAction(QIcon("image/grouptalk.jpg"),tr("进入群聊"));//添加右键菜单显示项 connect(EnterGroupTalk,SIGNAL(triggered()),this,SLOT(on_actionEnter_GroupTalk_triggered()));//使AddRecode与其他函数关联
八、主窗体,标签之类的一些外观设计
this->setFixedSize(this->width(), this->height());//固定大小 this->setWindowFlags(Qt::FramelessWindowHint);//去掉标题栏语句 QFont font("ZYSong18030", 12);//设置字体 this->setFont(font); //透明度 this->setWindowOpacity(0.8);
//标签
QLabel s_acount_label = new QLabel(this);
s_acount_label->setFont(QFont("ZYSong18030", 8));//字体小点
s_acount_label->setGeometry(155, 10, 60, 20);
九、以下是微小的展示效果,当然很多功能没有实现,慢慢完善吧,主要是想总结一下,不管好不好
十、(以上都不是什么很厉害的,其实网络编程应该很重要。我参考资料实现了群聊,但是对于tcp还不是很熟悉,所以以后慢慢再学习了,自己还是不行,所以就不贴了,觉得自己行的时候再说)
- qt ui界面控件布局设计
1.布局控件简介: 水平布局,里面的控件将水平展示,布局器里面的控件大小若没有固定,其大小将随着布局的大小而自动拉伸.可以通过设置其左(layoutLeftMargin).上(layoutTopMar ...
- Qt界面控件值获取异常处理
情景简述: 正常情况,我们从控件获取的值是OK的,但有时候就是奇怪的不对头,那么我们可以给获取后的值加上一个不痛不痒的函数,再返回,结果就OK了.至于原因嘛,[呲牙][呲牙] 比如: //正常情况 d ...
- Qt中如果通过QStyle自定义能够跨平台的界面控件
我们经常会碰到需要定制界面控件的要求.如果只是在一个平台上,比如说你的控件只需要在Windows上显示,那很好办,Hard code 你的look and feel就可以了.但是如果界面需要在不同平台 ...
- C#多线程操作界面控件的解决方案(转)
C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用
在前面介绍了两篇关于我的基于MVC4+EasyUI技术的Web开发框架的随笔,本篇继续介绍其中界面部分的一些使用知识,包括控件的赋值.取值.清空,以及相关的使用. 我们知道,一般Web界面包括的界面控 ...
- 转--基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用
原文 http://www.cnblogs.com/wuhuacong/p/3317223.html 基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用 在前面介绍了两篇关于我的基 ...
- 解析大型.NET ERP系统 灵活复杂的界面控件Infragistics WinForms
Infragistics 是.NET平台优秀的控件供应商,囊括了WinForms,ASP.NET,Silverlight,WPF,Windows Phone等所有关于微软.NET技术的界面控件.借助于 ...
- 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常
在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应 ...
- WinForm开发-界面控件到实体,实体到界面控件自动绑定
在WinForm开发中,我们是不是为绑定界面控件的数据而每个控件每个控件的赋值?在保存修改时是不是也是每个控件每个控件的赋值到实体中?字段一多,那简直就是噩梦.有没有像Web中那样方便的方法直接就自动 ...
- IOS学习资源收集--开发UI控件相关
收集的一些本人了解过的iOS开发UI控件相关的代码资源(本文持续补充更新) 内容大纲: 1.本人在github上也上传了我分装好的一些可重复利用的UI控件 2.计时相关的自定义UILabel控件 正文 ...
随机推荐
- pandas--对axis=0,axis=1的理解
Stackoverflow.com是程序员的好去处,本公众号将以pandas为主题,开始一个系列,争取做到每周一篇,翻译并帮助pandas学习者一起理解一些有代表性的案例.今天的主题就是Pandas与 ...
- XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem A. Arithmetic Derivative
题目:Problem A. Arithmetic DerivativeInput file: standard inputOutput file: standard inputTime limit: ...
- i.MX 6Q开发环境配置
#适用于 Ubuntu 14.04 x64 imx6qdl-cubox-i.dtsi #更新系统 sudo apt-get update sudo apt-get upgrade #安装基 ...
- iOS开发之NSUserDefaults
在ios中偏好设置保存用户配置的对象 //NSUserDefaults读取 //获取标准函数对象 //通过对象获取名称下NSMutableDictionary数据 NSUserDefaults *de ...
- Oracle中用触发器实现自动记录表数据被修改的历史信息
oracle中用触发器实现自动记录表数据被修改的历史信息. 有一些比较重要的表字段每次修改需要做历史记录,以后可以查询这个表中某些字段如何被修改过.由什么改成了什么等,由谁操作,操作时间等. 实例:1 ...
- 【DeepLearning学习笔记】Neurons神经元
今天找到一个比较好的deep learning的教材:Neural Networks and Deep Learning 对神经网络有详细的讲解,鉴于自己青年痴呆,还是总结下笔记吧=.= Percep ...
- java反射 - getXXX 与 getDeclaredXXX
1.getXXX 和 getDeclaredXXX java 里 Class<?> 有下面这些方法: 类似的方法有: 2.getMethod(s) 和 getDeclaredMethod( ...
- 【c++ primer, 5e】【try语句块】
p172~p177:c++的try语句块和异常处理: 1.通常,与用户交互的代码和对象相加(底层的代码)是分离开的,异常由与用户交互的代码处理(底层代码抛出异常就可以了). 2.C++的runtime ...
- Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析
关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸机开发 —— IIC总线 ,下面回顾下 IIC 基础概念 一.IIC 基础概念 IIC(Inter-Integrated Ci ...
- @component的注解
1.@controller 控制器(注入服务) 2.@service 服务(注入dao) 3.@repository dao(实现dao访问) 4.@component (把普通pojo实例化到spr ...