
Qt
文章平均质量分 63
SilentAssassin
If you wish for peace, prepare for war
展开
-
explicit和QObject的禁止拷贝
常用的mainwindow.h中对构造函数是这样声明的:explicit MainWindow(QWidget *parent = 0);,为什么有个explicit?其实是为了禁止构造函数的隐式转换。构造函数如果只有一个参数,那么存在一个隐式转换,将参数的数据转换为该类的对象,比如String类:class String{ public: String(const ...原创 2018-07-17 09:39:19 · 2308 阅读 · 2 评论 -
Qt中多线程的使用(一)
我们要实现的是读取大文件qtgui.index的内容加入文本框中。 很容易想到的方法: QFile* file = new QFile("E:\qtgui.index"); file->open(QIODevice::ReadOnly); QTextStream *stream = new QTextStream(file); while(!st...原创 2018-07-19 07:55:00 · 17340 阅读 · 0 评论 -
Qt中多线程的使用(二)
线程池当线程的任务量比较大时,频繁创建和销毁线程会有很大的内存开销,此时使用QThread的方法就不合适,应该使用线程池QThreadPool。QThread适用于常驻内存的任务,QThreadPool适用于不常驻内存,任务量比较大的情况。QRunnable 是一个非常轻量的抽象类,它的主体是纯虚函数 QRunnable::run(),我们需要继承它并实现这个函数。使用时需要将其子类的实例...原创 2018-07-19 07:55:51 · 1024 阅读 · 0 评论 -
QObject模型和moveToThread
QObject 每个线程都以QThread实例表示,并且在内部拥有一个QThreadData来表示线程的基本数据。 事件处理是建立在线程上进行的,每个线程拥有一个待处理事件列表postEventList,保存了待处理的事件QPostEvent(如鼠标、键盘以及用户事件),同时每个线程维护了一个QEventLoop栈,但只有栈顶的QEventLoop对象参与当前事件处理 包括QThre...原创 2018-07-19 07:56:28 · 3979 阅读 · 0 评论 -
QTcpSocket::connectToHost内存泄漏的问题
使用QTcpSocket上网看博客时,发现有篇抄来抄去的博客提到QTcpSocket类的方法connectToHost会泄露内存,即使把调用这个方法的QTcpSocket实例delete掉,内存也不会释放。反复connectToHost会导致进程内存增长,必须控制connectToHost的使用次数!于是我来亲自验证一下,仍然拿之前写的Socket_Test进行测试。增加一个按钮,槽函数代码如...原创 2018-07-19 07:58:05 · 8515 阅读 · 5 评论 -
Qt TCP & UDP 使用总结
使用Qt Network模块开发了一个UDP和TCP测试工具,client和server都写在一起,运行时先选择模式,其中TCP部分主要使用QTcpServer和QTcpSocket两个类,采用异步方式。开始是参考霍亚飞的《Qt Creator快速入门》,后来自己做了不少修改,现在对发现的问题做一下总结和思考。 代码地址:Github上的代码Server部分霍亚飞的书上的liste...原创 2018-07-19 07:58:53 · 2695 阅读 · 0 评论 -
Qt常用命令和pro参数
Qt常用工具(命令行指令)位于 C:\Qt5.7.1\5.7\msvc2015_64\bin 命令 功能 assistant 帮助文档 designer 设计器 linguist 翻译工具 lupdate 提取翻译字符串和生成ts文件 lrelease 从ts文件生成qm文件 moc Qt Meta Ob...原创 2018-07-25 12:03:38 · 1803 阅读 · 0 评论 -
解析QDataStream操作QString
sizeof与size,length先看这样的代码: QString s="abcdefg"; qDebug().noquote()<<"sizeof:"<<sizeof(s); // 4 qDebug().noquote()<<"length:"<<s.length(); // 7原创 2018-07-21 10:51:17 · 4632 阅读 · 0 评论 -
解析Qt元对象系统(一) 概述
Meta-Object System 提供了Qt的信号和槽机制以及对象之间的互相通信,运行时的信息和动态属性系统。三个必要条件: 1. QObject的子类 2. 宏Q_OBJECT 3. Meta Object CompilerQt官方建议对自定义的QObject子类都要加这个宏,但要注意:某些类不是继承自QObject,这些类里加Q_OBJECT就会出错,例如QEvent,QGr...原创 2018-07-21 10:53:12 · 3486 阅读 · 0 评论 -
解析Qt元对象系统(二) Q_OBJECT
Q_OBJECT宏的定义在qobjectdefs.h:#define Q_OBJECT \public: \ QT_WARNING_PUSH \ Q_OBJECT_NO_OVERRIDE_WARNING \ static const QMetaObject staticMetaObject; \ virtual const QMetaObject *met...原创 2018-07-21 10:53:37 · 2204 阅读 · 0 评论 -
解析Qt元对象系统(三) 信号与槽
引述我们从普通的点击按钮过程来看一下信号与槽的运行机制。先运行一个普通的QWidget程序,添加一个按钮,定义一个槽函数test,函数体里做个断点,调试运行,可以看到从回调函数qt_internal_proc开始,一直到槽函数。元对象系统的调用层次如下 QAbstractButtonPrivate::click和QAbstractButtonPrivate::emitClicked属于源...原创 2018-07-21 10:54:02 · 2662 阅读 · 1 评论 -
解析Qt元对象系统(四) 属性系统
官方解释我们在Qt源码中可以看到一个QObject的子类经常会用到一些Q_开头的宏,例如QMainWindow类开始部分代码是这样的: Q_PROPERTY(QSize iconSize READ iconSize WRITE setIconSize) Q_PROPERTY(Qt::ToolButtonStyle toolButtonStyle READ toolButt...原创 2018-07-21 10:54:30 · 1156 阅读 · 3 评论 -
QSpacerItem和Qt布局
QSpacerItemQSpacerItem就是Qt设计模式中的分隔条,有人可能说一个分隔条有什么可研究的,我之前也是这么想,没想到今天发现里面玄机还真是不少。首先看最神奇的一个现象:不添加到布局的分隔条无法在设计模式中保存。在窗口上拖两个分隔条,一横一竖。 然后保存 重新打开后,发现两个分隔条竟然不见了!既然保存后分隔条不见了,那么每次编译也就不会在ui_.h里产生QSp...原创 2018-07-18 12:14:03 · 2660 阅读 · 0 评论 -
Qt内存管理(五) 自动垃圾回收机制
实现自动垃圾回收的工具主要是Qt对象清理器,也就是QObjectCleanupHandler类,它监视多个QObject对象的生命期。当你想知道被别人拥有的QObject对象是否被删除时,这个类就派上了用场。例如引用(referencing memory)了程序中的共享库内存的场合。为了追踪某些QObject对象,使用add()添加对象,不再跟踪时使用remove()。被cleanup han...原创 2018-07-18 09:15:49 · 2795 阅读 · 0 评论 -
Qt内存管理(四) deleteLater
源码:void QObject::deleteLater(){ QCoreApplication::postEvent(this, new QDeferredDeleteEvent());}bool QObject::event(QEvent *e){ switch (e->type()) { ...... case QEvent::Defe...原创 2018-07-18 09:15:07 · 7479 阅读 · 0 评论 -
QTimer与事件循环和多线程
定时器的源码分析startTimer返回定时器的ID,在定时时间到了后,收到一个QTimerEvent,并覆盖虚函数timerEvent进行处理,该QTimerEvent包括了定时器ID看QTimer的源码就明白了:QObject::startTimer(){ if (Q_UNLIKELY(!d->threadData->eventDispatcher...原创 2018-07-17 09:40:06 · 7194 阅读 · 0 评论 -
解析Qt的ui_*.h文件
mainwindow.h常见的几行:namespace Ui { class MainWindow; } ......private: Ui::MainWindow *ui; mainwindow.cpp常见的几行:#include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *p...原创 2018-07-17 09:40:33 · 2403 阅读 · 0 评论 -
Qt Widget模块的常用方法
某按钮的名称为MyBtnbtn->isWidgetType() //bool值QWidget *parent = btn->parentWidget();QWidget::isWindow() //是否为WindowQObject::inherits //是否继承或为某个类QObject::children() //所有的childrenQWid...原创 2018-07-17 09:40:51 · 1373 阅读 · 0 评论 -
Qt杂项和小工具
qVersion:获取当前正在运行的Qt的版本号qDebug()<<qVersion(); //5.10.1qRound/qRound64:对浮点数取整,四舍五入qDebug()<<qRound(5.345); // 5Q_GADGET:不需要从QObject继承就可以使用Qt的Meta Object功能某些类,其父类不是 ...原创 2018-07-17 09:41:22 · 348 阅读 · 0 评论 -
Qt编码与转换问题汇总
QByteArray与QStringQString会用UTF-16编码存储,而qDebug()等I/O函数会以UTF-8编码处理。其实转换后的字节流是正确的,只是显示时用了和字节流不同的编码方式处理导致乱码// Qt默认会使用本机编码,所以对于中文系统,下面这句设置是多余的 QTextCodec::setCodecForLocale(QTextCodec::codecForName(“G...原创 2018-07-17 09:41:47 · 1174 阅读 · 0 评论 -
Qt命令行的使用
以前使用命令行指定参数启动Qt程序都是用argc和argv,有时用Build环境设置,现在才知道原来Qt从5.2就有了两个类 QCommandLineParser 和 QCommandLineOption ,专门用于命令行启动,它们属于Core模块。这两个类只在main函数中使用,在使用之前,首先完成两件事: 1. 在pro文件中添加CONFIG += console,否则不生效。 2. ...原创 2018-07-17 09:42:07 · 2905 阅读 · 0 评论 -
Qt中的d指针和q指针
概述如果程序从一个以前版本的库动态链接到新版本的库之后,能够继续正常运行,而不需要重新编译,那么我们就说这个库是二进制兼容的。如果一个程序需要重新编译来运行一个新版本的库,但是不需要对程序的源代码进一步的修改,这个库就是源代码兼容的。如果不确保版本之间的二进制兼容性,人们将被迫提供静态链接的二进制文件。静态二进制文件不好,因为它们浪费资源(尤其是内存),不能让程序从库中错误修正或扩展中...原创 2018-07-17 09:42:36 · 2831 阅读 · 1 评论 -
Qt 父子对象管理
几个常用的函数从[半自动内存管理]一文可知Qt采用了树形的父子对象管理,所有对象都分配在heap上,Qt提供了几个函数管理这个对象树。 看代码:QObject* pA1 = new QObject( Q_NULLPTR );pA1->setObjectName( "A1" );QObject* pB1 = new QObject( pA1 );pB1->setObj...原创 2018-07-17 09:43:06 · 924 阅读 · 1 评论 -
Qt 事件循环(一)
当事件循环处理完一个事件后,就从“事件循环队列”中取出下一个事件处理之。当事件循环队列为空的时候,它和一个啥事也不做的永真循环有点类似,但是和永真循环不同的是,事件循环不会大量占用CPU资源。事件循环的本质就是以队列的方式再次分配线程时间片。事件循环是可以嵌套的,一层套一层,子层的事件循环执行exec()的时候,父层事件循环就处于中断状态;当子层事件循环跳出exec()后,父层事件循环才能...原创 2018-07-18 09:12:17 · 1027 阅读 · 0 评论 -
Qt内存管理(一) 半自动内存管理机制
概述看多了Qt的代码就会发现,很多人的代码里大量使用new,却很少看到delete,以至于我刚学Qt时也养成了这个习惯,在写C++时也不用delete,结果造成很多麻烦。原因在于Qt采用半自动的内存管理,不像c++那种全需要自己delete堆内存对象。Qt对象继承自QObject, QObject内部有一个list,会保存children,即QObjectList* children;还有...原创 2018-07-18 09:12:52 · 3617 阅读 · 3 评论 -
Qt内存管理(二) qDeleteAll与clear
qDeleteAll:专门用于指针容器,对容器或者迭代器中的每个对象进行delete操作,而不是从容器中移除对象。源代码如下:void qDeleteAll(ForwardIterator begin, ForwardIterator end) { while (begin != end) { delete *begin; ...原创 2018-07-18 09:13:36 · 12293 阅读 · 2 评论 -
Qt内存管理(三) Qt的智能指针
智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。Qt常用的智能指针有QPointer,QScopedPointer,QSharedPointer。关于这几个智能指针,网上的博客基本不是翻译Qt文档,就是翻译老外的博客,比较失望。QPointerQPointer属于Qt对象模型的特性,本质是一个模板类,它为QObje提供了gu...原创 2018-07-18 09:14:31 · 6555 阅读 · 0 评论 -
解析Qt元对象系统(五) Q_INVOKABLE与invokeMethod
概述查看Qt源码可知,Q_INVOKABLE是个空宏,目的在于让moc识别。 使用Q_INVOKABLE来修饰成员函数,目的在于被修饰的成员函数能够被元对象系统所唤起。 Q_INVOKABLE与QMetaObject::invokeMethod均由元对象系统唤起。这一机制在Qt C++/QML混合编程,跨线程编程,Qt Service Framework 以及 Qt/ HTML5混合编程以...原创 2018-07-21 10:55:04 · 4327 阅读 · 0 评论