Qt
2014年8月1日创建
2014年8月17日 增加国际化内容
2014年8月27日QtCreator 添加工具条
Qt程序为C++程序的基础上开发的。
以main开始。
Qt程序有一个唯一的代表本程序的类QApplication。生成其对象后,运行exec()函数,则程序运行。
QtApplication具有一个唯一的活动窗体QWidget,使用setActiveWindow()设置。QtApplicate将会以活动窗体的生命周期为主生命周期。
qApp代表本程序的QtApplicate的实例。
对象类:QObject是QWidget的基类 ,QWidget是所有UI的基类。
主窗口类:QMainWindow,具有菜单和工具条等基本窗口部件。
对话框类:QDialog,对话框类。
控件类:QWidget,所有控件基本。
信号与槽技术是Troll Tech公司独立创建的技术。使用MOC(meta object compiler)创建合乎C++标准的回调函数。
信号:事件,包含用户事件,内部状态事件。使用成员函数实现。
发射信号:emit。
槽:处理事件。标准函数+添加slot标志。
连接:将signal与slot进行connect,这样在emit signal时就调用slot。
使用信号和槽时,必须首先声明Q_OBJECT宏。
声明槽:public slots:。
声明信号:singals:(这里没有范围标志)。
发射信号:emit 信号函数。
连接信号和槽:connect(sender,signal,receiver,slot);
断开信号与槽的连接:disconnect(sender,signal,receiver,slot);
信号和槽之间的参数可以不匹配。
可以将信号与信号进行连接。
如果连接到当前的槽,则可能省略receiver,但并不推荐这么做,会引起混淆。
将qt的信号和槽转化为标准的C++代码。
MOC在Qt的bin目录下moc.exe。
使用方法
moc .h文件–o .moc文件
这里.moc文件就是标准的c++头文件。
在使用时,需要将所有使用信号和槽的头文件转化为.moc文件,然后将moc文件包含在头文件中(不要包含在cpp文件中)。
QMainWindow是一个遵循Windows窗体的Widget,可以包含菜单,工具条,状态栏等标准窗体控件。
可以使用QMdiArea,QMdiSubWindow来设置MDI。
QScrollArea:指定区域滚动。将窗体作为QScrollArea的子控件使用(setWidget())。注意,此时子控件的内存将由QScrollArea进行释放。
QScrollBar:滚动条。
样式布局,可以设置滚动条。
QAction:item.SLOT can be connet here.
QMenu:menu.
QMenuBar:bar.
QMainWindow中使用menuBar()->addMenu()添加到当前主窗口。
QToolBar:添加QAction进行事件响应。
QMainWindow中使用addToolBar()将添加工具条添加到当前主窗口。
在QtCreator中,UI具有maintoolbar,只要向这个工具中添加action,就可以直接显示相关工具了(可以直接将action拖动到工具条上完成添加)。
参考:http://blog.sina.com.cn/s/blog_721533f70100no6g.html
如果要向窗体中添加新的工具条,要吧在QtCreator的对象浏览器中右击主窗体对象MainWindows-》添加工具条,就会生成一个新工具条。
参考:http://www.qtforum.org/article/27123/qt-creator-how-to-add-toolbars.html
statusBar():如果存在,则返回指针,如果不存在,则创建后返回指针。
所有带有边框的部件的基类。
用于调整边框效果。
具有自动补全功能。
可以被具有编译功能的控件使用。
微调日期时间。
可以设置样式。
setIcon():设置图片。
单选按钮,复选按钮。
放在QButtonGroup中组成一组。
QTableView是QTableWidget的基类。
增加行、列数目:setRowCount(),setColumnCount()。
删除行、列:removeRow()、reomveColumn()。
设置水平表头:setHorizontalHeadLabels()。
设置垂直表头:setVertialHeadLabels()。
设置编辑方式:setEditTriggers()。
设置选中方式:setSelectionBehavior()。
获取选中内容:处理相关的信号。
参考:http://blog.csdn.net/xgbing/article/details/7774737
添加项:addItem()
删除项:takeItem();removeItemWidget();记得要delete item。
修改项:首先将item设置为可编辑(pItem->setFlags(Qt::ItemIsEnabled|Qt::ItemIsEditable)),然后将使用editItem(pItem)。
获取选中项:处理相关信号。
添加项:addItem()
删除项:removeItem()。
修改项:setItemText()。
获取选中项:处理相关信号。或直接使用currentText()。
添加项:在布局中添加项。
布局:setLayout()可以用于添加布局。
用于设置单选按钮为一组。
用于将子控件大小变为可以拖动,并统一布局。
添加子部件:以splitter为父控件,或者addWidget。
设置切分方法:setOrientation();
用于不同页面的切换。
添加页面:addTab()。
删除页面:removeTab()。
切换页面:setCurrentTab()。
获取当前页面:CurrentIndex(),currentWidget()。
滑块控件。
设置范围:setRange()。
设置刻度间隔:setTickInterval()。
设置步进值:setPageStep(),setSingleStep()。
获取当前值:value();处理valueChanged信号。
微调控件。
设置范围:setRange()。
设置步进值:setSingleStep()。
获取当前值:value();处理valueChanged信号。
树状列表框。
首先要设置col宽度。
添加Root:addTopLevelItem()。
添加subItem:以RootItem为父Item构造。
当前选中项:currentItem()。
进度条。
设置进度:setValue()。
获取当前进度:value()。
验证器,用于输入验证。
通过时触发editingFinished、returnPressed,不通过时无效。
可以通过派生于QValidator的类,实现validate()函数来实现验证输入信息。可以返回明确的同意或拒绝,当未完成输入时,返回不确定。
在GUI的交互中,menu,toolbar等同一个响应事件,可能会有许多的入口。为了使多个控件可以使用相同的响应事件,Qt中使用QAction抽象为行为的类。
QAction的主要用途是对于菜单项、工具按钮、快捷方式等多个入口提供统一的行为。在QMenu中提供了简单的构造QAction的方法。
QAction一般在UI设计时,作为主窗口ui类的私有成员,在控件调用之前创建,并用控件的addAction()方法添加引用(这一步可以在UI的设计中自动完成)。
然后在逻辑主类中与相关的SLOT函数connect进行使用。
//ui_xx.h
class Ui_MainWindow
{
public:
QAction*actionOpen;
QAction*actionExecQuery;
………………………………….
actionOpen = newQAction(MainWindow);
actionOpen->setObjectName(QString::fromUtf8("actionOpen"));
actionExecQuery =new QAction(MainWindow);
actionExecQuery->setObjectName(QString::fromUtf8("actionExecQuery"));
………………………………….
menu->addAction(actionOpen);
menu_2->addAction(actionExecQuery);
………………………………….
///xx.cpp
//execqueryaction
connect(ui->actionExecQuery,SIGNAL(toggled()),this,SLOT(execQuery()));
绘图工作需要在一个QPaintDevice上使用QPainter进行绘制,绘制功能由QPaintEngine提供(由QPainter调用,由各种图形库提供,用户一般不用处理)。
具体的绘制工作由QPainter完成,结果和数据源由QPaintDevice提供。
可以应用QPainter进行绘图。
重载paintEvent()。
begin();设置当前为active。
具体的绘制工作。只能放在此区域时才能被处理。
end();清除当前的active状态。
可以绘制各种图形。
可以设置多种样式。
支持各自格式的颜色。
缩放、裁剪等功能。
shear():表示裁剪坐标系,使坐标系统的大小变为原来的倍数。0,表示不变。其它数值表示扩展为原来的多少倍。然后,图像坐标在新坐标系统中重新显示。
rotate():旋转。以度为单位。顺时针。
translate():平移。
scale():缩放。
setViewPort():设置设备坐标范围。默认为设备范围。可以用此函数人为设置设备的范围(只是改变当前的范围,设备并不能改变,但是输出认为已经改变)。
setWindow():设置逻辑坐标范围。默认为设备范围。可以用此函数人为设置逻辑坐标范围。可以据此与设备坐标的关系,重新绘制输出。
使用QMovie可以控制gif。
首先使用QMovie打开gif,然后指定到相关QLabel(setMovie)。调用start()开始播放。
可以作为设备的类:能够直接处理图像数据。包含QImage(图像处理)、QPixmap(显示)、QBitmap(单色QPixmap)、QPiture(QPainter处理过程)。全部继承于QPaintDevice,能够被QPainter直接在内存中操作。
读写文件:QImageReader、QImageWriter用于处理数据的加载和保存的统一接口,并提供多种操作功能。
读写数据:QImage专门用于数据读写
格式转换:可以进行相互转换。
图像的存取,使用QPicture。
作为一个内存设备。可以用作QPainter的内存设备。用于对QPainter的内存操作,可以读写为pic文件。
QPicture.load():读取图像。
使用时,先load pic文件,再使用QPainter绘制Pic文件。
QPicture.save():保存图像。
使用时,首先在生成一个图像,然后使用QPainter绘图,完成后再save。
打印机:QPrinter。
打印机设置:QPrintDialog。
打印内容:QPainter在QPrinter上绘图。
需要在qmake中添加printsupport。
参考:http://blog.csdn.net/heqiuya/article/details/8075473
QFileDialog。
获取打开文件名称:getOpenFileName()。
获取保存文件名称:getSaveFileName()。
QColorDialog。
获取选中颜色:getColor()打开对话框,选中后返回。然后使用QColor获取。
QProgressDialog。
设置进度值、进度范围:同进度条(QProgressBar)。
QMessageBox。
显示消息:构造消息,然后show()。
QFontDialog。
获取选中字体:getFont()。
QDialog:是所有对话框类的基类,用于生成自定义对话框。
模式、非模式对话框:可以设置开关标志设定。
使用共同的基类QDialog。
返回值:统一使用done(int)。更为方便的是使用accept(),reject(),
QTabDialog。
添加选项卡。
获取选择状态。
QErrorMessage。
带有消息提示和继续提示checkbox样式的对话框。
显示消息:showMessage()。
显示调试信息:qHandler():将qDebug(),qWarning() and qFatal()输出到QErrorMessage。
QWizard。
用于自由切换,状态选择的向导。
需要傅QWizardPage作为向导的每个步骤。
目标是自动管理所有的控件,用于大量控件的自动布局。
布局必须在Widget上。
QLayout:所有布局类的基类。
QBoxLayout:QHBoxLayout和QVBoxLayout的基类。如果无法确定按行、列排列,使用此类。
QHBoxLayout、QVBoxLayout:按行,列排列。
QGridLayout:按网络排列。setColumnStretch()设置列数,行数据此推算。
QFormLayout:表格可式排列,Label后+edit。
布局使用一个政策来确定sizeHint()大小如何变化。
sizeHint():设置大小。此大小为用户设置大小,程序将以此大小为主进行设置。
minimumSizeHint():最小大小建议。建议值。
minimunSize():最小大小。设置后minimumSizeHint()无效。
QSizePolicy::Fixed():固定大小。
QSizePolicy::Minimum():最小。
QSizePolicy::Maximum():最大。
QSizePolicy::Preferred():最优。
QSizePolicy::Ignored():忽略。
QSizePolicy::Expanding():可以伸缩,倾向扩展。
QSizePolicy::MinimumExpanding():最小,可以伸缩,倾向扩展。
读取:QFile打开文件,QTextStream获取文件流,QTextStream调用read函数读取数据。使用完成后关闭。
写入:打开时用write权限,然后向流中写入信息。
使用QDir读取当前目录下的所有内容,使用【】可以读取其中一条子目录。
指定目录后可以操作相应的信息。
配置文件用于记录用户对软件的设定。在Windows中使用系统注册表(麻烦),在MacOS中使用喜好XML。在Unix中无标准,一般使用ini文件。
所以默认情况下,如果我们创建一个QSettings,则在Windows中生成一个注册表项,在其它操作系统中也有相应的文件生成。如果指定为INIForma,可以在创建时指定存储位置,默认情况下位置存放在用户文档下。
QSettings是线程安全的,但数据更改后并不会立即写入,使用Sync()可以获取、写入最新的数据。
配置文件有多种类型,NativeFormat表示使用系统API定义,也INIFormat表示使用ini文件,也可以自定义类型。
默认情况下,使用用户组织=》程序名作为QSettings的名称。在INIFormat中可以指定名称。
配置文件分为用户范围和系统范围两种作用域。
配置文件中以【Section】为分割段。
配置文件中的数据以键值对的方式组织数据,键是QString类型,值为QVariant类型。
可以将任何类型直接转换为QVariant,但是从QVariant只能直接转换为QtCore范围内的格式,对于其它格式,使用QVariant::value
不同的OS中对于大小写敏感性不同,所以应该尽量使用相同的大小写格式读写数据,但不以大小写为识别特性。
在查询配置项时,可以按照用户项、组织项、系统用户项、系统组织项的顺序查找,也可以禁用这种回溯查询。
如果在QApplication中指定ApplicationName、OrganizationName,则可以直接使用QSettings默认构造函数创建。
如果创建指定名称的ini文件,则可以指定ini文件路径。
使用setValue(key,value)写入。
直接写入,以/表示Section/Key。
或是以
BeginGroup(Section);
setValue(key,value);
endGroup();
使用value(key)读取。
直接写入,以/表示Section/Key。
或是以
BeginGroup(Section);
value(key,value);
endGroup();
参考:http://blog.csdn.net/qiurisuixiang/article/details/7760828
//inisetting create and writing
QStringstrIniFilePath=qApp->applicationDirPath()+"/npp.ini";
QSettingsiniSetting(strIniFilePath,QSettings::IniFormat);
iniSetting.setValue("section/a","a-value");
iniSetting.setValue("section2/aa","aa-value");
iniSetting.beginGroup("Group");
iniSetting.setValue("x1","xx1");
iniSetting.setValue("y1","xy1");
iniSetting.endGroup();
//inisettings reading
QStringstrIniFilePath=qApp->applicationDirPath()+"/"+qApp->applicationName()+".ini";
QSettingsiniSetting(strIniFilePath,QSettings::IniFormat);
QStringstrPreceptList=iniSetting.value("precept/precept").toString();
m_lstPreceptItem=strPreceptList.split(",");
QStringstrTargetList=iniSetting.value("target/target").toString();
m_lstTargetItem=strTargetList.split(",");
iniSetting.beginGroup("sql");
for(inti=0;i<m_lstPreceptItem.size();++i){
QStringstrSQL=iniSetting.value(m_lstPreceptItem[i]).toString();
m_lstSQL<qDebug(strSQL.toStdString().c_str());
}
iniSetting.endGroup();
13 OpenGL
OpenGL:平台无关的2D、3D图形标准API接口规范。其实现由硬件厂商完成。
在QT中所有OpenGL类都由QGLWidget派生。
继承此类时,需要重载三个保护函数:
intializeGL():初始化,设置GL参数。
resizeGL():改变大小时调用,完成后调用paintGL()。
paintGL():渲染时调用。
透视效果:远小近大。从视点到边界的角度为透视角,60度以内为正常,超过60则失真。
参考:http://wenku.baidu.com/view/0de47c4de518964bcf847c03.html
http://blog.csdn.net/silangquan/article/details/7866193
voidQMyGLWidget::initializeGL(){glShadeModel(GL_SMOOTH);glClearColor(0.0,0.0,0.0,0.0);glClearDepth(1.0);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);}voidQMyGLWidget::resizeGL(intwidth,intheight){if(height==0){
height=1;}
glViewport(0,0,(GLint)width,(GLint)height);glMatrixMode(GL_PROJECTION);glLoadIdentity();
gluPerspective(60.0,(GLfloat)width/(GLfloat)height,1,1000.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}floatfRot=0;voidQMyGLWidget::paintGL(){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f);glColor3f(1.0,1.0,1.0);glRotatef(++fRot,11,0,0);glBegin(GL_TRIANGLE_STRIP);glColor3f(0.0,1.0,0);glVertex3f(0.0, 1.0, 0.0);glColor3f(1.0,-1.0,1.0);glVertex3f(-1.0, -1.0, 1.0);glColor3f(1.0,-1.0,1.0);glVertex3f(1.0, -1.0, 1.0);glColor3f(1.0,0.0,0);glVertex3f(1.0, 1.0, -1.0);glColor3f(1.0,1.0,0);glVertex3f(0.0, 1.0, 0.0);glColor3f(1.0,0.0,1.0);glVertex3f(-1.0, -1.0, 1.0);glEnd();
glLoadIdentity();
glTranslatef(-1.5f,3.0f,-6.0f);glBegin(GL_QUADS);glVertex3f(-1.0, 1.0, 0.0);glVertex3f( 1.0, 1.0, 0.0);glVertex3f( 1.0,-1.0, 0.0);glVertex3f(-1.0,-1.0, 0.0);glEnd();
}
14 QtCreator
14.1 概述
QtCreator不支持中文和带空格的路径,使用前要注意。
对于带空格的路径,使用$$quote(path)。
路径符号使用/或者\\。
在函数名称之前使用/**则自动生成Doxygen注释。
参考:http://blog.csdn.net/superjoel/article/details/5314225
14.2 UI文件
代表界面布局。
14.2.1UI原理
使用ui文件来进行可视化布局。布局完成后编译,生成ui_xx.h文件,这个文件中包含类:
1) UI_XX:表明是某个mainwindow的UI文件,所有数据将以此对象为父对象。
2) namespace Ui::XX:这是个外壳类,供外部使用。
UI_XX类中包含所有的控件及setupUI(youWindow),retranslateUI()。setupUI()将以为指定的对象生成可视化布局的内容。retranaslateUI()将对编码进行转换。
14.2.2UI使用
使用UI时,只要将外壳类添加到声明,并将ui_xx.h头文件包含在要使用的cpp文件中,然后生成其对象,调用setupUI(this),就可以将ui内容在本对象中生成一份。
14.3 资源文件RCC和QRC
qrc文件用于指定资源的位置和名称。是一个xml文件,用于其它文件对资源的使用,目的是使用资源独立化。
使用rcc编译为二进制之后,变化rcc文件。
可以使用别名来指定真实资源的引用名称。
14.3.1术语
前缀/路径:就是路径,前缀专指顶级目录,一般用资源类型指定,标明其类型,路径就是在此类型下的路径,仅是代表一种关系,并没有真实的路径。
别名:被直接引用的名字称为别名,默认与实现路径相同,但是一般应该修改为简单的名称,便于引用,并与实际位置独立。
14.3.2使用方法
使用时其位置为(:前缀/路径/别名)。
例如:
icon.addFile(QStringLiteral(":/image/myimage/uninstallxx.ico"), QSize(),QIcon::Normal, QIcon::Off);
而其实际的qrc文件为
prefix="/image/myimage"> alias="uninstallxx.ico">xx0/xdfd/uninstall.ico
14.3.3编译
1) 可以手动使用rcc工具编译(不推荐):
rcc -binary myresource.qrc -o myresource.rcc
手动编译完成后,要手动进行注册,才后使用:
QResource::registerResource("/path/to/myresource.rcc");2) 但更简便的方法是加入到pro文件中,由qmake自动编译、注册。
14.3.4编辑
可以在QtCreator中直接使用资源编辑器或文本编辑器编辑。也可以使用QtDesigner进行编辑。
参考:http://blog.sina.com.cn/s/blog_4b9ee9e501010mtn.html
http://blog.csdn.net/bzhxuexi/article/details/10260537
14.4 编译和链接
可以在项目中设置构建目录设置输出目录。
14.4.1qmake
是一个专门为QT开发的,用于生成makefile文件的工具,可以用来生成各种平台上的各种工程文件。
默认为直接包含qt的库。如果不使用qt库,则CONFIG -= qt。
qmake 使用.pro为输入文件,然后生成makefile,例如:
qmake –oout.makefile test.pro
参考:http://zh.wikipedia.org/zh-cn/Qmake
http://lifegoo.pluskid.org/wiki/QMake.html
14.4.1.1 makefile 和make工具
在linux/unix上用于自动进行编译的工具,是一系统shell命令的集合,能够自动检测变化,并以此为依据进行更新编译。
14.4.2PRO文件
用于进行项目管理的文件。用于qmake生成makefile文件。
包含了项目的名称、类型、依赖的库等所有信息。
另外,还自动生成一个当前系统信息的xml文件pro.user文件。
注意:
不支持中文和带空格的路径,使用前要注意。
对于带空格的路径,使用$$quote(path)。
路径符号使用/或者\\。
多个值时,使用空格分开,如果需要换行,则使用\。
可以检测或简单的逻辑,
参考http://my.oschina.net/laopiao/blog/87160
14.4.2.1 格式
KEY += setset set
换行使用\
14.4.2.2 语法
注释:#。
编码类型:CODECFORSRC
项目类型:TEMPLATE
配置信息:CONFIG
头文件:HEADERS
源文件:SOURCES
目标文件名称:TARGET
目标文件路径:DESTDIR
库头文件:INCLUDEPATH
库文件:LIBS
库目录文件:LIBS += -LPATH
库文件:LIBS += -lfilename 或者LIBS += filename.lib
资源文件qrc:RESOURCES
rcc临时目录:RCC_DIR
rcc文件:RC_FILE
UI文件目录:UI_DIR
UI文件:FORMS
moc文件临时目录:MOC_DIR
object文件临时目录:OBJECTS_DIR
QTS库:QT
平台专用:win32{pro数据}
宏定义:DEFINES
参考:http://blog.csdn.net/alspwx/article/details/12649225
14.4.2.3 关键字
1) QT
QT += core gui …包含QT的模块。core是qt的核心模块,所有与QT有关的程序都要使用,gui是界面模块,其它模块查看帮助,按需添加。
默认自动添加core模块。
QT += core:将包含$(QTDIR)/include/QtCore,加入$(DTDDIR)/lib/qtcore4.lib,定义QT_CORE_LIB。
2) CONFIG
加入编译选项。
可以选择加入的qt模块,输出的警告信息,release或者debug编译等。
默认包含qt。
3) TEMPLATE
模板,表示项目将输出什么类型的文件。
app:输出可执行文件的makefile,如exe
lib:输出库文件的makefile
vcapp:输出可执行文件的vs工程文件
vclib:输出库文件的vs工程文件
subdirs:子工程目录的makefile文件
4) 取环境变量$$
$${a}:环境变量a的字符串。
$$(PATH):环境变量PATH的路径。
5) 其它
TARGET = name:生成文件名称,默认是项目名称。
TEMPLATE = app:当前项目模板为app模板,生成exe。
SOURCES += xx.cpp:所有源文件。
HEADERS += xx.h:所有头文件。
FORMS += xx.ui:所有UI文件。
LIBS += xx.lib:所有lib文件。
INCLUDEPATH+=xx\:所有头文件路径。注意:以\结束。
14.5 调试
qDebug(),qWarning(),qFatal()均为全局函数。
qDebug(),qWarning():用法相同,但代表不同的级别。
qFatal():调用后会在显示信号后退出。
Q_ASSERT():如果为FALSE,则中断并显示调试信息。
Q_CHECK_PTR():检查指针,如果为空,则调用qFatal()。
QDebug:#include
可以使用qDebug()函数直接输出。
使用printf()样式的格式化输出或使用<<样式的流输出。
资源:RC_FILE += xx.rc
rc格式:ID TYPE 属性 位置
14.6 内存泄漏检测
14.6.1使用vld,可以在debug模式下检测。
在Pro文件中加入:
win32{CONFIG(debug,debug|release){DEFINES+=_DEBUG#vld2.2downloadedfromhttp://vld.codeplex.com/VLD_PATH=$$quote(D:/ProgramFiles(x86)/VisualLeakDetector)INCLUDEPATH+=$$quote(D:/ProgramFiles(x86)/VisualLeakDetector/include)LIBS+=-L$$quote(D:/ProgramFiles(x86)/VisualLeakDetector/lib/win32)-lvld}
}
在main文件中加入
#ifdef _DEBUG
#include "vld.h"
#endif
参考:http://blog.csdn.net/dyw/article/details/6860473
14.6.2使用vc时,可以使用VC的内存泄漏检测方法
参考:..\CPP\内存泄漏检测.docx
14.7 发布
使用dependents walker(depends.exe)(vc6和vc2003自身带有这个工具,但之后的vc版本不带,可以自由下载,是免费软件)可以检测程序的依赖项,然后复制到同一个目录下,作为NSIS安装使用。
NSIS:nullsoft scriptable install system。免费的win32安装、卸载程序。
HM NSIS EDIT:NSIS的IDE工具。
在HM NSIS EDIT的向导中,创建NSIS脚本,并编译,然后,就可以进行安装、卸载。
参考:
http://blog.sina.com.cn/s/blog_a6fb6cc90101fer8.html
15 进程间通信
15.1 剪贴板
QClipBoard。
由QApplication自动维护。不能自由创建。可以派生。
读写数据:SetData()/Data()及其它。
15.2 拖放
15.2.1原理
执行拖放操作时,分两步操作drag、drop,数据由QDrag传递,由QMimeData包装。
drag:拖时,需要放入原始数据(QDrag包装,在mousePressEvent()中定义)。然后执行exec(),此后由Drop处理事件接管(如果有相应的处理函数,则处理;如果没有,则无法确定),不再由mouseMoveEvent()处理。如果需要处理其它的,比如拖动的距离(防抖动)等,则需要将数据放入mouseMoveEvent()中执行exec。
drop:
当在dropEnterEvent()接收了Action之后,可以处理mousemove事件,由mouseMoveEvent()或DragMouseMoveEvent()处理move事件。
注意:QDrag在执行完exec()后,drop处理程序接管,这很关键。
注意:QDrag和QMimeData由QT处理,不能删除。如果exec()返回MoveAction,则应该删除Data。
15.2.2细节
拖放起效最小时间:QStyleHints::startDragTime()
拖放起效最小距离:QStyleHints::startDragDistance()
拖放最慢速度:默认为0。QStyleHints::startDragVelocity()
dragenterevent:QDragEnterEvent。当可以接收数据时,进入控件则发出。只能在此事件处理程序中接受了Action,才能继续接受move。
dragmovevent:QDragMoveEvent。可以设置接受的Rectangle。
dragleaveevent:QDragLeaveEvent。如果没有QDropEvent发布,则离开时发布此事件。
dropevent:QDropEvent。能够接受此Action。
拖放数据读写:QMimeData。
接收拖放数据:setAcceptDrops(true)。查看EVENT的性质,如果能够处理,则接受。只有这里接受了,move,leave事件才能起作用。
结束拖放:accept()。
QMimeData:用于剪贴板和拖放的数据。
使用:被用于QDrag、QClipBoard的传输。
读写数据:setData()/Data()及其它便捷函数。
开始拖数据:
重载mousePressEvent():
判断当前拖的状态:左键按下,并且在指定的范围内。
创建QDrag对象,并设置数据。
QDrag执行exec()。
16 国际化QString
Qt内部使用Unicode。在使用与用户交互的UI中,都使用QString,遇到char时,将强制转换为QString。QString具有转换为std::string的功能。应尽量使用QString避免转换。
在国际化方面,任何编码,只要能够与Unicode进行互转,就能够在Qt中正确显示。所以在Qt中进行转码,必须使用Unicode中间层。
为了使用翻译,应该在源码和ui中全部使用英语,然后添加翻译文件以运行不同的国际化需要。
参考:http://hi.baidu.com/dreammerge/item/3db98955d5db4fc09e2667bc
16.1 QString
16.1.1内存结构
Qt内部的字符串使用Unicode作为字符单位,每个字符由一个QChar表示,QChar由16bit的Unicode表示。如果要与Ansi进行转换,需要转换为QLatin1Char(由8bit的ansi表示)。可以使用QString::data()获取QChar的字节指针(16bitUnicode)。
在Qt中字符串指针(char *)由QByteArray实现,但是其实现时,为节省内存,使用写时复制技术(如果无变化,则使用同一段物理内存)。QByteArrsy::size()只统计有效字符个数,但其保证为每个字符串后有一个’\0’。
默认情况下,QByteArray使用deep-copy,如果不需要,则可以使用QByteArray::fromRawData()。也因此,只有在具有一个完整的QByteArray对象时才能进行读写操作。
参考:http://blog.sina.com.cn/s/blog_539d078401014eoh.html
16.1.2格式化输出
格式化,不再使用printf样式的格式化,
使用%n,加arg(value)设置。
QStringstrSQL=str1.arg(“aa”);
格式化之后原字符串不变,返回格式化之后的字符串。
16.1.3格式转换
QString->char *:只能先转换为QByteArray(将16bit转换为8bit)(QString::toLatin1()或toAscii()(由于此函数与toLatin1()过于相似,已经于Qt5中去除)或toLocal8bit()),再进行转换,不可以级连转换。
QString->std::string:QString::toStdString()。
参考:http://www.cppblog.com/Alina-zl/archive/2008/11/19/67323.html
16.2 QT国际化原理
1) 首先在源程序中使用tr()函数,标记要进行翻译的字符串。
2) 然后在一个.qm的二进制翻译文件中:查找所有tr(),并放入源字符串和目标字符串,翻译为二进制文件。
3) 在程序中加入相关的翻译信息,在运行时遇到tr()就会自动查找翻译文件,找到则替换,否则使用源字符串。
16.3 实现
1) 创建tr()条目:在需要进行翻译的地方设置标记。
2) 创建.qm二进制翻译文件
a) 在.pro中添加翻译文件(xml,由lupdate生成,这里只需要添加名称)
b) 然后调用lupdate(命令行)进行翻译,得到本工程中所有的tr()标记(输出到xml文件中)的xml文件,
c) 调用linguist为xml的条目作为翻译,并将译好的xml翻译为二进制qm(文件-)发布)(快一点,并且保密啊)(也可以手动修改或用其它工具修改)。
i. xml文件:每个翻译条目都由一个message节处理。包含源文件定位(location),源字符串(source),翻译注释(translatorcomment),翻译字符串(translate)。
Translate
目标注释
目标字符串
ii. 这里要注意:linguist可以从xml翻译文件中找到源文件,并标明出处。
d) UI翻译:在使用designer进行界面设计时,每个界面元素都被标准为tr(),可以在xml文件中进行翻译。
3) 在源文件中应用翻译:使用QTranslator的对象,调用load()加载.qm文件(指定绝对路径)。然后appliation对象调用installTranslator()装载QTranslator对象就可以了。
参考:http://devbean.blog.51cto.com/448512/245063
16.3.1 示例
1) 创建tr()条目
//xx.cpp
voidMainWindow::createUIItems(){//方案选项QStringListlstPreceptItem;lstPreceptItem<"totalReduce")< "unitReduce"); ui->comboBox->addItems(lstPreceptItem);m_lstPreceptItem=lstPreceptItem;//作用目标选项QStringListlstTargetItem;for(inti=0;i<m_lstTargetItem.size();++i){lstTargetItem<<(tr(m_lstTargetItem[i].toStdString().c_str()));}
ui->comboBox_2->addItems(lstTargetItem);}
2) 创建qm文件
a) 添加ts文件
//xx.pro
TRANSLATIONS+=npp.ts
b) 生成qm文件
调用 lupdate xx.pro 生成npp.ts
linguist 打开npp.ts,添加翻译内容,发布后生成npp.qm
3) 使用qm文件
//translationsettingQStringstrTranslateFilePath=qApp->applicationDirPath()+"/npp.qm";QTranslatorqtTranslator;qtTranslator.load(strTranslateFilePath);
a.installTranslator(&qtTranslator);
QTranslatorqtTranslator2;qtTranslator2.load(qApp->applicationDirPath()+"/qt_zh_CN.qm");a.installTranslator(&qtTranslator2);
16.4 手动显示中文
1) QString::fromUtf8()
2) 如果设置之后仍然提示,可能与源代码的编译有关,在源码上右击,点击保存时使用utf-8 bom。
3) 如果需要手动翻译几个文字(不推荐这样使用,很容易出现问题,且不易排查,最好使用tr),可以使用将文件转换为unicode的方法加以显示。
示例:
char *pTotal = "总消减率最高";
QString strTotal = m_pCodec->toUnicode(pTotal,strnlen(pTotal,20));
17 日期时间
17.1 日期QDate
只能进行日期的读取和比较和运算(dayto)。
当前日期:currentDate()。
格式:在toString()函数中可以指定输出格式。
17.2 时间QTime
用于时间显示和定时器(应用广泛,计算程序用时等)。
当前时间:currentTime()。
格式:在toString()函数中指定。
定时器:start(),restart(),elapsed()。
17.3 日期时间QDateTIme
综合使用QDate和QTime。
将QDate和QTime的值赋予QDateTIme。
18 可移植性
尽量使用QT的类和函数,即使是标准库文件,在不同的平台上实现也不同,但QT在不同的平台上能很好的保持一致。
对于无法移植的功能,可以使用相同名字的类,并放入不同文件中,根据平台选择。或者是在同一个头文件中声明,但在不同的CPP文件中实现。
你可能感兴趣的:(QT)