Qt综述

Qt

[email protected]

2014年8月1日创建

2014年8月17日 增加国际化内容

2014年8月27日QtCreator 添加工具条

 

1  总述

Qt程序为C++程序的基础上开发的。

以main开始。

Qt程序有一个唯一的代表本程序的类QApplication。生成其对象后,运行exec()函数,则程序运行。

QtApplication具有一个唯一的活动窗体QWidget,使用setActiveWindow()设置。QtApplicate将会以活动窗体的生命周期为主生命周期。

qApp代表本程序的QtApplicate的实例。

1.1 类关系

对象类:QObject是QWidget的基类 ,QWidget是所有UI的基类。

主窗口类:QMainWindow,具有菜单和工具条等基本窗口部件。

对话框类:QDialog,对话框类。

控件类:QWidget,所有控件基本。

 

2 信号与槽 Signal and Slot

信号与槽技术是Troll Tech公司独立创建的技术。使用MOC(meta object compiler)创建合乎C++标准的回调函数。

信号:事件,包含用户事件,内部状态事件。使用成员函数实现。

发射信号:emit。

槽:处理事件。标准函数+添加slot标志。

连接:将signal与slot进行connect,这样在emit signal时就调用slot。

2.1 使用方法 

使用信号和槽时,必须首先声明Q_OBJECT宏。

声明槽:public slots:。

声明信号:singals:(这里没有范围标志)。

发射信号:emit 信号函数。

连接信号和槽:connect(sender,signal,receiver,slot);

断开信号与槽的连接:disconnect(sender,signal,receiver,slot);

信号和槽之间的参数可以不匹配。

可以将信号与信号进行连接。

如果连接到当前的槽,则可能省略receiver,但并不推荐这么做,会引起混淆。

3 MOC元对像编译

将qt的信号和槽转化为标准的C++代码。

MOC在Qt的bin目录下moc.exe。

使用方法

moc  .h文件–o .moc文件

这里.moc文件就是标准的c++头文件。

在使用时,需要将所有使用信号和槽的头文件转化为.moc文件,然后将moc文件包含在头文件中(不要包含在cpp文件中)。

4 窗体

4.1 主窗体QMainWindow

QMainWindow是一个遵循Windows窗体的Widget,可以包含菜单,工具条,状态栏等标准窗体控件。

可以使用QMdiArea,QMdiSubWindow来设置MDI。

4.2 滚动条

QScrollArea:指定区域滚动。将窗体作为QScrollArea的子控件使用(setWidget())。注意,此时子控件的内存将由QScrollArea进行释放。

QScrollBar:滚动条。

样式布局,可以设置滚动条。

4.3 菜单

QAction:item.SLOT can be connet here.

QMenu:menu.

QMenuBar:bar.

QMainWindow中使用menuBar()->addMenu()添加到当前主窗口。

4.4 工具条

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

 

4.5 状态条

statusBar():如果存在,则返回指针,如果不存在,则创建后返回指针。

5 控件

5.1 QFrame

所有带有边框的部件的基类。

用于调整边框效果。

5.2 QCompleter

具有自动补全功能。

可以被具有编译功能的控件使用。

5.3 QDateTimeEdit

微调日期时间。

可以设置样式。

5.4 QPushButton

setIcon():设置图片。

5.5 QRadioButton、QButtonGroup、QCheckBox

单选按钮,复选按钮。

放在QButtonGroup中组成一组。

5.6 QTableView,QTableWidget

QTableView是QTableWidget的基类。

增加行、列数目:setRowCount(),setColumnCount()。

删除行、列:removeRow()、reomveColumn()。

设置水平表头:setHorizontalHeadLabels()。

设置垂直表头:setVertialHeadLabels()。

设置编辑方式:setEditTriggers()。

设置选中方式:setSelectionBehavior()。

获取选中内容:处理相关的信号。

参考:http://blog.csdn.net/xgbing/article/details/7774737

 

5.7 QListWidget

添加项:addItem()

删除项:takeItem();removeItemWidget();记得要delete item。

修改项:首先将item设置为可编辑(pItem->setFlags(Qt::ItemIsEnabled|Qt::ItemIsEditable)),然后将使用editItem(pItem)。

获取选中项:处理相关信号。

5.8 QComboBox

添加项:addItem()

删除项:removeItem()。

修改项:setItemText()。

获取选中项:处理相关信号。或直接使用currentText()。

5.9 QGroupBox

添加项:在布局中添加项。

布局:setLayout()可以用于添加布局。

5.10 QButtonGroup

用于设置单选按钮为一组。

5.11 QSplitter

用于将子控件大小变为可以拖动,并统一布局。

添加子部件:以splitter为父控件,或者addWidget。

设置切分方法:setOrientation();

5.12 QTabWidget

用于不同页面的切换。

添加页面:addTab()。

删除页面:removeTab()。

切换页面:setCurrentTab()。

获取当前页面:CurrentIndex(),currentWidget()。

5.13 QSlider

滑块控件。

设置范围:setRange()。

设置刻度间隔:setTickInterval()。

设置步进值:setPageStep(),setSingleStep()。

获取当前值:value();处理valueChanged信号。

5.14 QSpinBox

微调控件。

设置范围:setRange()。

设置步进值:setSingleStep()。

获取当前值:value();处理valueChanged信号。


 

5.15 QTreeWidget

树状列表框。

首先要设置col宽度。

添加Root:addTopLevelItem()。

添加subItem:以RootItem为父Item构造。

当前选中项:currentItem()。

5.16QProgressBar

进度条。

设置进度:setValue()。

获取当前进度:value()。

5.17 QDoubleValidator、QIntValidator

验证器,用于输入验证。

通过时触发editingFinished、returnPressed,不通过时无效。

可以通过派生于QValidator的类,实现validate()函数来实现验证输入信息。可以返回明确的同意或拒绝,当未完成输入时,返回不确定。

6 抽象的行为:QAction

在GUI的交互中,menu,toolbar等同一个响应事件,可能会有许多的入口。为了使多个控件可以使用相同的响应事件,Qt中使用QAction抽象为行为的类。

QAction的主要用途是对于菜单项、工具按钮、快捷方式等多个入口提供统一的行为。在QMenu中提供了简单的构造QAction的方法。

6.1 使用方法

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

 

 

 

7 正则表达式

 

8 绘图

绘图工作需要在一个QPaintDevice上使用QPainter进行绘制,绘制功能由QPaintEngine提供(由QPainter调用,由各种图形库提供,用户一般不用处理)。

具体的绘制工作由QPainter完成,结果和数据源由QPaintDevice提供。

8.1 绘图

可以应用QPainter进行绘图。

8.1.1绘图规则

重载paintEvent()。

begin();设置当前为active。

具体的绘制工作。只能放在此区域时才能被处理。

end();清除当前的active状态。

8.1.2绘制图形

可以绘制各种图形。

8.1.3样式控制

可以设置多种样式。

8.1.4颜色控制

支持各自格式的颜色。

8.1.5坐标控制

缩放、裁剪等功能。

shear():表示裁剪坐标系,使坐标系统的大小变为原来的倍数。0,表示不变。其它数值表示扩展为原来的多少倍。然后,图像坐标在新坐标系统中重新显示。

rotate():旋转。以度为单位。顺时针。

translate():平移。

scale():缩放。

setViewPort():设置设备坐标范围。默认为设备范围。可以用此函数人为设置设备的范围(只是改变当前的范围,设备并不能改变,但是输出认为已经改变)。

setWindow():设置逻辑坐标范围。默认为设备范围。可以用此函数人为设置逻辑坐标范围。可以据此与设备坐标的关系,重新绘制输出。

8.2 设备

8.2.1gif

使用QMovie可以控制gif。

首先使用QMovie打开gif,然后指定到相关QLabel(setMovie)。调用start()开始播放。

8.2.2格式

可以作为设备的类:能够直接处理图像数据。包含QImage(图像处理)、QPixmap(显示)、QBitmap(单色QPixmap)、QPiture(QPainter处理过程)。全部继承于QPaintDevice,能够被QPainter直接在内存中操作。

读写文件:QImageReader、QImageWriter用于处理数据的加载和保存的统一接口,并提供多种操作功能。

读写数据:QImage专门用于数据读写

格式转换:可以进行相互转换。

8.2.3QPicture

8.2.3.1  图像的读取

图像的存取,使用QPicture。

作为一个内存设备。可以用作QPainter的内存设备。用于对QPainter的内存操作,可以读写为pic文件。

QPicture.load():读取图像。

使用时,先load pic文件,再使用QPainter绘制Pic文件。

8.2.3.2  图像的存储

QPicture.save():保存图像。

使用时,首先在生成一个图像,然后使用QPainter绘图,完成后再save。

 

9 打印

打印机:QPrinter。

打印机设置:QPrintDialog。

打印内容:QPainter在QPrinter上绘图。

需要在qmake中添加printsupport。

参考:http://blog.csdn.net/heqiuya/article/details/8075473

 

 

10    对话框

10.1 打开、保存文件对话框

QFileDialog。

获取打开文件名称:getOpenFileName()。

获取保存文件名称:getSaveFileName()。

10.2 颜色选择对话框

QColorDialog。

获取选中颜色:getColor()打开对话框,选中后返回。然后使用QColor获取。

10.3 打印设置对话框

 

10.4 进度条对话框

QProgressDialog。

设置进度值、进度范围:同进度条(QProgressBar)。

10.5 消息对话框

QMessageBox。

显示消息:构造消息,然后show()。

10.6 字体选择对话框

QFontDialog。

获取选中字体:getFont()。

10.7 自定义对话框

QDialog:是所有对话框类的基类,用于生成自定义对话框。

模式、非模式对话框:可以设置开关标志设定。

使用共同的基类QDialog。

返回值:统一使用done(int)。更为方便的是使用accept(),reject(),

10.8 选项卡对话框

QTabDialog。

添加选项卡。

获取选择状态。

10.9 错误消息对话框

QErrorMessage。

带有消息提示和继续提示checkbox样式的对话框。

显示消息:showMessage()。

显示调试信息:qHandler():将qDebug(),qWarning() and qFatal()输出到QErrorMessage。

10.10 向导对话框

QWizard。

用于自由切换,状态选择的向导。

需要傅QWizardPage作为向导的每个步骤。

11    布局

目标是自动管理所有的控件,用于大量控件的自动布局。

布局必须在Widget上。

QLayout:所有布局类的基类。

QBoxLayout:QHBoxLayout和QVBoxLayout的基类。如果无法确定按行、列排列,使用此类。

QHBoxLayout、QVBoxLayout:按行,列排列。

QGridLayout:按网络排列。setColumnStretch()设置列数,行数据此推算。

QFormLayout:表格可式排列,Label后+edit。

11.1 大小设置

布局使用一个政策来确定sizeHint()大小如何变化。

sizeHint():设置大小。此大小为用户设置大小,程序将以此大小为主进行设置。

minimumSizeHint():最小大小建议。建议值。

minimunSize():最小大小。设置后minimumSizeHint()无效。

QSizePolicy::Fixed():固定大小。

QSizePolicy::Minimum():最小。

QSizePolicy::Maximum():最大。

QSizePolicy::Preferred():最优。

QSizePolicy::Ignored():忽略。

QSizePolicy::Expanding():可以伸缩,倾向扩展。

QSizePolicy::MinimumExpanding():最小,可以伸缩,倾向扩展。

 

 

12    文件

12.1 文件读写:QFile

读取:QFile打开文件,QTextStream获取文件流,QTextStream调用read函数读取数据。使用完成后关闭。

写入:打开时用write权限,然后向流中写入信息。

12.2 目录读写:QDir

使用QDir读取当前目录下的所有内容,使用【】可以读取其中一条子目录。

12.3 文件信息读写:QFileInfo

指定目录后可以操作相应的信息。

12.4 配置文件:QSettings

12.4.1原理

配置文件用于记录用户对软件的设定。在Windows中使用系统注册表(麻烦),在MacOS中使用喜好XML。在Unix中无标准,一般使用ini文件。

所以默认情况下,如果我们创建一个QSettings,则在Windows中生成一个注册表项,在其它操作系统中也有相应的文件生成。如果指定为INIForma,可以在创建时指定存储位置,默认情况下位置存放在用户文档下。

QSettings是线程安全的,但数据更改后并不会立即写入,使用Sync()可以获取、写入最新的数据。

配置文件有多种类型,NativeFormat表示使用系统API定义,也INIFormat表示使用ini文件,也可以自定义类型。

12.4.2数据组织

默认情况下,使用用户组织=》程序名作为QSettings的名称。在INIFormat中可以指定名称。

配置文件分为用户范围和系统范围两种作用域。

配置文件中以【Section】为分割段。

配置文件中的数据以键值对的方式组织数据,键是QString类型,值为QVariant类型。

可以将任何类型直接转换为QVariant,但是从QVariant只能直接转换为QtCore范围内的格式,对于其它格式,使用QVariant::value进行转换。

不同的OS中对于大小写敏感性不同,所以应该尽量使用相同的大小写格式读写数据,但不以大小写为识别特性。

在查询配置项时,可以按照用户项、组织项、系统用户项、系统组织项的顺序查找,也可以禁用这种回溯查询。

12.4.3创建配置文件

如果在QApplication中指定ApplicationName、OrganizationName,则可以直接使用QSettings默认构造函数创建。

如果创建指定名称的ini文件,则可以指定ini文件路径。

12.4.4写入INI数据

使用setValue(key,value)写入。

直接写入,以/表示Section/Key。

或是以

BeginGroup(Section);

setValue(key,value);

endGroup();

12.4.5读取INI数据

使用value(key)读取。

直接写入,以/表示Section/Key。

或是以

BeginGroup(Section);

value(key,value);

endGroup();

 

参考:http://blog.csdn.net/qiurisuixiang/article/details/7760828

12.4.6示例

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

    //translationsetting
    QStringstrTranslateFilePath=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)