作者:gnuhpc 

出处:http://www.cnblogs.com/gnuhpc/

我们以QLineEdit这个类为例来看看如何学习分析一个QT类。

1.Public Types:

这是一个在这个类中可以供我们使用的公共枚举类型。这也就是说,我们可以如下使用这个公共类型:

// some code
..
QLineEdit::EchoMode mode;
mode = myLineEdit->echoMode(); ... mode = QLineEdit::NoEcho;
myLineEdit->setEchoMode( mode );
// or directly myLineEdit->setEchoMode( QLineEdit::NoEcho );

Public types经常使用在Properties中。

2.Properties

Properties可以被get和set,上边的例子就有所体现。

3.Public Functions

这个部分提供了大量这个类实例的方法,textEdit->append( "Path to file: " + lineEdit->text() );

4.Public Slots

这个部分描述了我们能连接信号的一些动作,这些动作构成了与其连接的signal的结果,也就是说,一个signal发出回导致一个一个slot的动作发生。我们也可以自定义信号槽,比如:

myqtapp.h

public slots:

void mySlot(const QString&);

myqtapp.cpp

void myQtApp::mySlot(const QString& passedStr)
{
QMessageBox::information(this, "Some window label here", "String: " + passedStr);
}
然后我们以这样的方式连接这个槽:connect( lineEdit, SIGNAL( textEdited (const QString&) ), this, SLOT( mySlot(const QString&) ) );

5.Signals

这个部分描述了这个类能发出信号的部分,这些信号与特定的slot连接,导致了slot对应动作的发生。也就是说,信号相当于原因,而slots相当于结果。比如

 connect( pushButton_clear, SIGNAL( clicked() ), this, SLOT( clear() ) );

在这里我们把pushButton_clear的clicked信号连接到了this的clear() 槽上,当这个按键按下时,this就会执行这个clear的动作。我们也可以自定义信号:

myqtapp.h

public:
myQtApp(QWidget *parent = 0); signals:
void customSignal( const QString& );
..

myqtapp.cpp - 要使用emit关键字

void myQtApp::clear() 



emit customSignal( textEdit->toPlainText() );//信号在此发出,带一个字符串 

    textEdit->clear(); 

}

我们可以如下连接我们自定义的信号:connect( this, SIGNAL( customSignal (const QString&) ), this, SLOT( mySlot(const QString&) ) );

6.Protected functions

这个就是C++传统意义上的Protected方法。

7.Static Public Members

这个也是指全局都能使用的类方法,不需要创建实例就可以直接调用。

8.const QString &

这个定义在QT的文档中经常见到。其实这个也可以不加const &,主要是为了performance——在方法中不需要再复制一份参数,提高了程序性能。const则是说这个传进来的参数不可修改。

9.在堆上或者栈上分配内存

例如,我们使用QProcess这个类,我们写了如下的函数:

void myQtApp::function()
{
QProcess proc; // we create this proc variable on stack
proc.start("regedit.exe"); // start program regedit.exe
}

我们以为会调用这个exe,但实际上并没有,终端调试信息显示:

QProcess: Destroyed while process is still running.

这是因为变量在程序栈上,当这个变量越出了这个范围,栈上的这个部分的内存就会被释放。在我们这个例子中,proc在这个程序执行结束前就被销毁了。解决的方法就是在堆上建立这个变量:当程序员使用new进行动态内存分配的时候,内存是分配在堆(虚拟内存,包括板上RAM和硬盘剩余空间所分配的硬盘)上的。

void myQtApp::function()
{
QProcess *proc; // pointer definition
proc = new QProcess( this ); // memory allocation from heap, created with parent
proc->start("regedit.exe"); // start program
}

注意使用this的的原因是父进程销毁后子进程亦销毁。

另外一种方法是将proc放入类myQtApp中成为一个类成员。

如何分析一个QT类的更多相关文章

  1. 每天一个Qt类之QWidget

    每天一个Qt类之QWidget QWidget类是所有用户界面对象的基类 继承QObject和QPaintDevice 被QButton.QFrame.QDialog.QComboBox.QDataB ...

  2. Qt 类外调用一个 private slots 函数

    MainWindow中 private slots 函数 void print_on_log(QString strtemp);输出一个字符串到编辑窗口中 class MainWindow:publi ...

  3. 【Java EE 学习 69 下】【数据采集系统第一天】【实体类分析和Base类书写】

    之前SSH框架已经搭建完毕,现在进行实体类的分析和Base类的书写.Base类是抽象类,专门用于继承. 一.实体类关系分析 既然是数据采集系统,首先调查实体(Survey)是一定要有的,一个调查有多个 ...

  4. Struts2 源码分析——Action代理类的工作

    章节简言 上一章笔者讲到关于如何加载配置文件里面的package元素节点信息.相信读者到这里心里面对struts2在启动的时候加载相关的信息有了一定的了解和认识.而本章将讲到关于struts2启动成功 ...

  5. Qt类继承图

    对于学习Qt的,有一个Qt所有类的继承图表,是很有需要的.以下提供了Qt5.1的所有类的继承关系图.看的时候,可以放大和缩小.如需文档下载,可以加入最后的QQ学习群.

  6. Win32下 Qt与Lua交互使用(四):在Lua脚本中自由执行Qt类中的函数

    话接上篇.通过前几篇博客,我们实现在Lua脚本中执行Qt类中函数的方法,以及在Lua脚本中连接Qt对象的信号与槽. 但是,我们也能发现,如果希望在Lua脚本中执行Qt类的函数,就必须绑定一个真正实现功 ...

  7. Win32下 Qt与Lua交互使用(二):在Lua脚本中使用Qt类

    话接上篇.成功配置好Qt+Lua+toLua后,我们可以实现在Lua脚本中使用各个Qt的类.直接看代码吧. #include "include/lua.hpp" #include ...

  8. 可重入与线程安全(大多数Qt类是可重入,非线程安全的)

    可重入与线程安全 在Qt文档中,术语“可重入”与“线程安全”被用来说明一个函数如何用于多线程程序.假如一个类的任何函数在此类的多个不同的实例上,可以被多个线程同时调用,那么这个类被称为是“可重入”的. ...

  9. Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)

    Internationalization with Qt 应用程序的国际化就是使得程序能在国际间可用而不仅仅是在本国可用的过程. Relevant Qt Classes andAPIs 以下的类支持Q ...

随机推荐

  1. android 关于ScrollView 的博客做记录学习

    1.Android ScrollView向上滑动控件顶部悬浮效果实现 2.[android]仿知乎ScrollView滚动改变标题栏透明度 3.github开源Android组件资源整理(五)Scro ...

  2. 【JavaSE】Java问题总结

    使用BufferedInputStream时OutOfMemoryError异常 eclipse Luna安装subversion(SVN) 使用BufferedInputStream时OutOfMe ...

  3. 大白第一章第四节dp例题

    入口 UVALive - 3882 #include<cstdio> using namespace std; ; int n,m,k,f[N]; int main(){ //f[i]表示 ...

  4. 小程序WePY入门(一)

    全局安装或更新WePY命令行工具 npm install wepy-cli -g 在开发目录中生成Demo开发项目 wepy new myproject 切换至项目目录 cd myproject 开启 ...

  5. MongoDB API java的使用

    1.创建一个MongoDB数据库连接对象,它默认连接到当前机器的localhost地址,端口是27017. Mongo mongo=new Mongo(); 2.获得与某个数据库(例如“test”)的 ...

  6. 九度OJ 1064:反序数 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3758 解决:2773 题目描述: 设N是一个四位数,它的9倍恰好是其反序数(例如:1234的反序数是4321) 求N的值 输入: 程序无任 ...

  7. Arcgis SOE学习

    http://blog.csdn.net/lovecarpenter/article/details/53178233 http://blog.csdn.net/lovecarpenter/artic ...

  8. Java for LeetCode 109 Convert Sorted List to Binary Search Tree

    Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...

  9. linux删除目录下所有文件,但是保留文件夹

    删除目录和子目录下所有rpm文件,但是保留文件夹,先cd到想要删除的目录 命令如下 find ./ -name "*.rpm" | xargs rm

  10. Android Weekly Notes Issue #316

    July 1st, 2018 Android Weekly Issue #316 本期内容包含教你使用Kotlin通过Annotation Processor生成代码文件, JetPack中的Andr ...