QT从基础到进阶
文章平均质量分 62
梦回阑珊
程序员,年二十有九,始从文,连考而不中。 遂习武,练武场上发一矢,中鼓吏,逐之出。 改学IT,自撰一函数,用之,堆栈溢出。无奈之际,发现一洞,刻有武学,为C++、QT、python、opencv,练之,终驰骋天下。
展开
-
《QT从基础到进阶·四十三》QPlugin插件多线程问题和只有插件dll没有头文件和lib文件时调用插件中的方法
创建插件对象不能放到多线程执行,不然报错:ASSERT failure in QWidget: "Widgets must be created in the GUlthread.第一步:插件实现纯虚函数时把方法通过 Q_INVOKABLE 宏注册到 Qt 的元对象系统中,即在方法前加Q_INVOKABLE。getinstance方法会在多线程执行,但loadPlugin会被强制塞入主线程执行,执行完毕继续多线程执行下面的代码。现通过QObject*直接调用getWidget。原创 2024-07-06 18:03:16 · 241 阅读 · 0 评论 -
《QT从基础到进阶·四十二》QT运行后项目图标,exe图标问题,VS加载.pro文件问题
,错误计数超过100,语法错误return,语法错误”原创 2024-06-04 19:58:05 · 309 阅读 · 1 评论 -
《QT从基础到进阶·四十一》无法解析的外部符号及生成事件加入QT打包命令报错问题
qt_metacall@ML_AddinManger@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)…该命令的目的是在编译的时候自动把需要的QT依赖编译到release目录下,相当于编译的时候直接打包了一个release版本,如果在生成后事件报错主要是无法识别windeployqt位置,需要在环境变量的path目录下加入QT的bin目录,比如D:\QT\5.15.2\msvc2019_64\bin。第一种写法将 Q_OBJECT 宏放在类的声明之后,而没有换行。原创 2024-06-03 20:23:40 · 541 阅读 · 1 评论 -
《QT从基础到进阶·四十》setObjectName的访问不明确和无法解析的外部符号 “public: static struct QMetaObject const ...
因为通常的C++中,我们只调用头文件的情况下,不需要把头文件加入项目中,让项目能找到就行,但QT不是这样,必须加入项目中才能让qmake MOC一遍。MOC这个鬼东西的奇妙之处就是,qmake只对头文件进行处理,不会对CPP进行处理。之前创建了QT控制台,是一个cpp文件,运行使用在qobject_cast强转时报无法解析的外部符号。通常发生在有多个不同命名空间中存在具有相同名称的函数或对象,并且编译器无法确定要使用哪一个。(2)在控制台项目-现有项中把调用的头文件加入进来(不一定能行)原创 2024-06-02 13:07:19 · 441 阅读 · 1 评论 -
《QT从基础到进阶·三十九》0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突或Access violation writing location 0x000000
RIOController单例中改为new一个对象,然后在mainWindow的析构中手动delete m_RIOController,这样,mainWindow析构的时候会先析构m_RIOController,走m_RIOController析构函数时里面的debug下的loggingWidget还没有被析构掉,这时可以正常调用,后面等到mainWindow析构完在析构对象数上的成员后loggingWidget才被析构。原创 2023-11-23 18:36:31 · 1186 阅读 · 1 评论 -
《QT从基础到进阶·三十八》QWidget实现炫酷log日志打印界面
我把log界面放在了收缩栏中,可以看到鼠标点击log界面可以收起,再次点击可以展开,收缩栏的实现前面文章已经讲解过,这里不在赘述。QWidget实现了log日志的打印功能,不仅可以在界面显示,还可以生成打印日志。上面代码先创建收缩栏对象,并设置收缩栏的父窗口和垂直布局,-1代表放置在收缩栏中的界面放在布局的最上层位置。SetParent把log界面的父窗口设为收缩栏,并通过addWidget把Log窗口添加到收缩栏中显示。(3)附加库目录添加logplus的lib目录。原创 2023-11-22 13:49:18 · 1190 阅读 · 2 评论 -
《QT从基础到进阶·三十七》QWidget实现左侧导航栏效果
(3)通过addMenuWidget设置第一个界面为"MTF",第二个参数0表示把该界面放在第一个标签上显示,第三个参数拿到mtf的界面传入放置到导航栏的m_centerQVBoxLayout布局中。NavigationBarPlugin插件类实现了对左侧导航栏的管理,我们可以在导航栏插件中添加界面,并用鼠标点击导航栏能够切换对应的界面。我们先把导航栏框架添加添加到主界面的左边,然后在主界面右边设置一个布局用于后面显示界面。(4)同理下面依次添加第二个标签和放置第二个界面,添加第三个标签放置第三个界面。原创 2023-11-22 10:14:26 · 1600 阅读 · 1 评论 -
《QT从基础到进阶·三十六》QWidget实现收缩栏的效果
3、可以用鼠标拖动界面改变界面的排放顺序。1、可以在收缩栏插件中添加界面。在收缩栏插件中添加两个界面。2、可以把界面展开或收缩。参数1:插入的界面指针。参数2:插入的界面标题。参数3:插入的界面图标。原创 2023-11-21 17:57:25 · 908 阅读 · 1 评论 -
《QT从基础到进阶·三十五》QT插件实现侧边工具栏tabBar
内部先拿到TabBar的dll转为QObject,再把QObject强转为TabBarPlugin对象,这是插件的使用方法,也可以直接new一个TabBarPlugin对象。四个小工具也是由插件实现,先拿到他们的对象,通过对象指针获取他们的界面,再把每个界面addWidget添加到标签栏中。(2)调换tabBar标签栏中所有界面的循序和删除小工具界面。(3)把tabBar标签栏中的小工具界面拖出来在放回去。3、现在可以对标签栏上的所有界面进行交互。(1)可以收缩和展开tabBar。原创 2023-11-20 16:10:10 · 798 阅读 · 2 评论 -
《QT从基础到进阶·三十四》qobject_cast动态强制转换
qobject_cast()函数的行为类似于标准c++ dynamic_cast(),但执行速度比dynamic_cast 更快,且不需要C++的RTTI 的支持,子类继承了父类的age值并进行了修改,把子类转成父类后可用拿到子类中修改的值,注意和多态有区别。如果对象的类型正确(在运行时确定),则返回一个非零指针,如果对象的类型不兼容则返回0。原创 2023-11-16 13:58:05 · 340 阅读 · 1 评论 -
《QT从基础到进阶·三十三》QT插件开发QtPlugin
(4)插件实现类需要继承QObject和抽象类,宏Q_INTERFACES(LogPlugin)把插件注册到QT元对象系统中,宏Q_PLUGIN_METADATA导出插件和包含插件的json信息。实现类中要加上signals:并重写updateTabWidgetPage,这里是信号所以没有具体实现,然后直接在实现类中发信号即可,槽函数同理,但槽函数有具体实现。插件是一个接口类,里面都是纯虚函数,正常不用继承QObject,也不用加Q_OBJECT。(1)关闭程序时插件是否自动析构插件内的所有对象取决于。原创 2023-11-16 13:25:41 · 961 阅读 · 1 评论 -
《QT从基础到进阶·三十二》Q指针和D指针用法
d指针是在主类中使用的,主类获取私有类或类中私有变量的指针q指针是在私有数据类中使用的,来获取主类对象指针Q_DECLARE_PRIVATE: MyClass能访问MyClassPrivate类中私有成员变量。Q_DISABLE_COPY: 防止D指针d_ptr二次释放。原创 2023-11-16 11:15:19 · 303 阅读 · 1 评论 -
《QT从基础到进阶·三十一》事件循环QCoreApplication,QGuiApplication,QApplication
QCoreApplication::instance())目的因QT的DLL没有自动创建事件循环,外部程序比如python调用QT的DLL时就会进入if里面创建事件循环,如果是带有界面的QT程序调用QT的DLL,本身界面的main函数中自带事件循环就不会走到if里面再次创建事件循环。但又不能运行QApplication (或 QGuiApplication 或 QCoreApplication)中的exec(),因为这是阻塞的,真正需要运行的是processEvents()原创 2023-11-16 10:46:39 · 475 阅读 · 1 评论 -
《QT从基础到进阶·三十》QVariant的基础用法
对于不支持的C++基础数据类型,如 short char,先通过toInt()转化为int类型,然后再将int转为其原本的数据类型。很多时候,需要几种不同的数据类型需要传递,如果用结构体,又不大方便,容器保存的也只是一种数据类型,而QVariant则可以统统搞定。原创 2023-11-16 10:15:10 · 316 阅读 · 1 评论 -
《QT从基础到进阶·二十九》QT,opencv源码调试
注意:QT源代码要用目前正在使用的QT版本的,我的是5.15.2,opencv目前是opencv_world451版本,不用的时候可以去掉,因为加入了源代码,程序会变慢。解决方案–右击–属性–调试源文件–把源代码路径加入进来。原创 2023-11-16 10:02:20 · 256 阅读 · 1 评论 -
《QT从基础到进阶·二十八》QProcess使用,从一个exe程序启动另一个exe程序
前一个只需要输入软件名称后面不用加.exe后缀,后一个字符串是把字符串内容传递给外部程序,通过外部程序的main(int argc, char*argv[])获取字符串内容,启动外部程序需要一个路径,一个参数,所以argc = 2,argv[0]存放路径,argv[1]存放参数。Start()启动了外部程序会接着走下面的程序,execute()启动了外部程序会等到外部程序结束才会走下面的程序。正常argv[0]显示的是exe所在的路径,argv[1]才是接受的参数原创 2023-11-15 17:07:24 · 1000 阅读 · 0 评论 -
《QT从基础到进阶·二十七》进度条QProgressBar
主线程有死循环的话需要在死循环设置QCoreApplication::processEvents();0到100分为255份,值为215时,进度条为100/255*215 = 84%原创 2023-11-15 14:59:57 · 300 阅读 · 0 评论 -
《QT从基础到进阶·二十六》绘制多个图形项(QGraphicsRectItem,QGraphicsLineItem,QGraphicsPolygonItem)
注意:多边形的绘制是先点击鼠标左键不松开,再点击右键,松开右键后确定第一个点,这时鼠标左键依旧不松开,移到其他地方再点击右键,松开右键确定第二个点,以此往复,当松开鼠标左键后会自动把这些点连成线形成一个多边形。参数4:是否禁用paint绘制事件,默认为false,表示方式1,通过给参数自动创建图形项,设置true表示方式2,可以用鼠标手动绘制图形项。在GraphicsView鼠标事件中调用drawControl 中的鼠标事件,主要有三个鼠标事件:鼠标按下,鼠标移动,鼠标放开。原创 2023-11-14 16:04:46 · 928 阅读 · 12 评论 -
《QT从基础到进阶·二十五》界面假死处理
假如有这样一种情况,我们在主线程写了一个死循环,当程序运行到主线程的死循环代码后界面便卡死点了没有反应,这里提供几种方法处理界面假死的情况,保证比如主线程在执行死循环没有退出的时候点击界面不会卡死能继续执行其他功能。还有一点要注意,比如点击按钮进入死循环,如果加了防止假死代码,界面可以动,如果再次点击按钮会再次进入死循环,这时候界面依旧可以动,但注意的是这时候是有两个死循环正在执行,需要退出两次才算真正的退出死循环。这个放在按钮里如果快速点两次按钮,他会产生两个事件循环,5秒后会依次出来两次。原创 2023-11-13 16:58:51 · 762 阅读 · 0 评论 -
《QT从基础到进阶·二十四》按钮组QButtonGroup,单选框QRadioButton和多选框QCheckBox
图中有三个单选按钮放进了一个QGroupBox,并且设置了水平布局,现在要将这三个单选按钮放进一个按钮组,之前的想法是先把三个按钮加入按钮组,再把按钮组放进QGroupBox的水平布局里,但好像行不通,现在知道按钮组QButtonGroup不需要放进布局,直接把按钮放进按钮组,这样的话三个按钮既在QGroupBox的水平布局里,也在QButtonGroup按钮组里。如果需要第三种状态,可以通过setTristate()来使它生效,并使用checkState()来查询当前的切换状态。原创 2023-11-13 16:39:54 · 1006 阅读 · 0 评论 -
《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件
当关闭窗口或者调用close关闭窗口会调用默认QCloseEvent事件,如果想在关闭窗口时做个弹窗提示,可以重写QCloseEvent事件,这时关闭窗口会自动调用重写的QCloseEvent事件。例子:关闭窗口时如果编辑的文本没有保存就弹窗提示是否保存。原创 2023-11-13 15:51:52 · 1348 阅读 · 0 评论 -
《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法
在Item调用方式3或者直接在item构造中设置方式3能有效避免界面卡顿问题,如果图形项涉及大量的旋转,缩放,剪切,则方式3效果会和方式1差不多,基本没啥效果,界面依旧卡顿,这时就应该用方式4。有时候因业务需要,paint函数在界面上绘制了成百上千个图形项Items,导致操作界面的时候有明显的卡顿感,下文会提供一种比较好的解决办法,先来了解下QGraphicsItem的缓存方式。请注意,在某些情况下使用缓存可能会导致问题。例如,如果您的项的位置或大小经常更改,则需要清除该项的缓存以确保正确性。原创 2023-11-13 14:37:15 · 1446 阅读 · 0 评论 -
《QT从基础到进阶·二十一》QGraphicsView、QGraphicsScene和QGraphicsItem坐标关系和应用
这里先创建一个矩形设置到sence中,然后再把图片设置到sence,运行后只看到图片看不到画的矩形原因在于sence中的items会根据additem的顺序展示出来,运行程序后先展示矩形,然后展示图片,但图片会覆盖矩形,所以只能看到图片,并不是矩形没有了,如果先additem图片在additem矩形,这样先展示图片,然后会在图片上画出矩形,这样可以正确显示。图像坐标系也是一个独立的坐标系,图像左上角默认为(0, 0)点,把图像放入scene,图像左上角坐标默认在scene的原点,设置图像左上角坐标。原创 2023-11-13 13:22:17 · 2297 阅读 · 0 评论 -
《QT从基础到进阶·二十》QThreadPool线程池的使用
/设置线程池中最多可以启动的线程数,比如设置2表示同一时间最多能启动两个线程,如果我有三个任务需要做,那同一时间只能做两个任务,剩下的一个任务需要等到两个线程中的一个线程做完上个任务才能做这个。线程池通过调用start函数把所有任务都放置到缓存队列中,这时所有任务并不是立刻执行,线程池会根据任务数量自动创建线程,任务会被合理分配到各个线程上执行,但总线程数量不会超过设置的最大线程数。如果有三个线程,三个任务,并不是每个线程一个任务,有可能一个线程两个任务,一个线程一个任务,还有一个线程空闲。原创 2023-11-10 16:50:19 · 807 阅读 · 0 评论 -
《QT从基础到进阶·十九》QThread多线程使用
不同线程共用同一个锁可以防止同时打印数据,比如两个线程同时打印0-100,如果给两个线程不加锁,或者各自定义一个锁,那两个线程都会一起打印0-100,如果两个线程用同一个锁,那么在第一个线程打印0的时候,第二个线程阻塞,当第一个线程释放锁的时候,第一个或第二个线程谁先抢到锁谁继续打印。thead.star()后并不会执行线程的内容,仅仅是启动了线程,线程的内容是doWork函数里的内容,当发送信号emit operate后才是真正执行线程的内容doWork函数。//开启子线程执行循环。原创 2023-11-10 15:42:13 · 442 阅读 · 0 评论 -
《QT从基础到进阶·十八》QT中的各种鼠标事件QEvent
如果在QGraphicsView中无法触发鼠标事件,这是因为鼠标事件是被QGraphicsView里面的viewport截取了,在viewport上安装一个事件过滤器,通过事件过滤来截取鼠标事件,实现鼠标事件的透传。pos()函数获取鼠标指针在窗口的位置,pos().x(), pos().y()获取坐标。如果涉及子界面的鼠标移动事件也需要在子界面的构造中加上鼠标跟踪。原创 2023-11-10 13:54:06 · 717 阅读 · 0 评论 -
《QT从基础到进阶·十七》QCursor鼠标的不同位置坐标获取
注意geometry()是相对于父窗口的相对位置,而QCursor::pos()获取的是鼠标绝对位置。当前光标相对于当前窗口的位置:this->mapFromGlobal(QCursor::pos())获取子窗口geometry,判断是否包含光标所在的坐标,如果是,则表示光标正悬浮在该子控件上。鼠标光标相对于整个电脑屏幕的位置:QCursor::pos()原创 2023-11-10 11:06:56 · 2089 阅读 · 0 评论 -
《QT从基础到进阶·十六》QT实现客户端和服务端的简单交互
服务端程序主要包含三块:打开消息监听,接收消息并反馈,关闭服务端。4、在服务端点击send接收客户端消息并通知客户端已收到消息。原创 2023-11-10 10:00:07 · 919 阅读 · 0 评论 -
《QT从基础到进阶·十五》用鼠标绘制矩形(QGraphicsView、QPainter、QGraphicsRectItem)
在GraphicsView类中创建矩形绘制对象,并初始化该对象用于绘制矩形。在GraphicsView类的鼠标事件中设置绘制矩形时鼠标按下,移动,释放操作。矩形长宽的拖动会在DrawROI类中实现,界面的缩放把DrawROI类中的功能放入GraphicsView中的滚轮事件中。以下是鼠标绘制矩形最全的一种用法,完整源码将会放在最后面。原创 2023-11-09 10:10:45 · 2961 阅读 · 13 评论 -
《QT从基础到进阶·十四》QPoint,QPen,QPainter,QFont,焦点事件使用
函数QPainter::isActive()的作用是:指示绘制程序是否处于活动状态。painter由begin()函数和接受QPaintDevice参数的构造函数激活,end()函数和析构函数将停用它。这里有个特殊情况,要说明一下,按照我们的理解,如果setWidth(0)的话,应该是线条宽度为0,应该是不显示线条啊。可是实际不是这样,当设置为线条宽度为0的时候,默认画笔的宽度一直是1像素宽。使用setColor(QColor(255, 0, 0, 100))定义画笔的颜色。原创 2023-11-05 22:15:51 · 365 阅读 · 1 评论 -
《QT从基础到进阶·十三》QPixmap、QImage的缩放——scaled
FastTransformation模式表示快速变换,SmoothTransformation模式表示平滑变换。比如在缩放图片时使用第一种方式可以快速获得缩放后的图片,但图片质量要差些,第二种模式获得图片质量要好些,但缩放的速度要差些。第三个参数也有两种表现形式,分别为Qt::FastTransformation和Qt::SmoothTransformation。第二个参数有两种表现形式,分别为Qt::IgnoreAspectRatio和Qt::KeepAspectRatio。第一个参数代表缩放后的尺寸。原创 2023-10-30 22:05:36 · 1293 阅读 · 0 评论 -
《QT从基础到进阶·十二》QPixmap.load加载图片不更新问题
原因:QPixmap中的load函数是将图片加载到缓冲区,即QPixmapCache中存放图片,当把第一张图片加载到缓冲区会显示图片1,当加载第二张图片时缓冲区的图片1并没有被覆盖,实际是缓冲区存了两张图片,并显示图片2,当再次加载图片1到缓冲区时,这时QPixmapCache认为已经有了图片1,会直接返回true,缓冲区的图片排列顺序并没有发生变化,固依旧显示图片2。实际情况是label先显示图片1正常,从图片1跟新为图片2也正常,再从图片2跟新为图片1就无法跟新了,还是依旧显示图片2,这是为啥?原创 2023-10-29 15:02:50 · 570 阅读 · 3 评论 -
《QT从基础到进阶·十一》QStackedWidget和QListWidget使用
注意:像带有页面切换的组件,比如QComboBox、QStackWidget等,一些current…Changed()可以作为信号,setCurrent…()可以作为槽函数。//多次执行是一行一行打印出来。//多次执行,helloworld不是一行一行的显示出来,而是一次性显示出来。原创 2023-10-25 22:26:22 · 277 阅读 · 1 评论 -
《QT从基础到进阶·十》QTableView,QTableWidget,QLineEdit设置只读和输入限制
class AgeDelegate : public QItemDelegate{ Q_OBJECTpublic: AgeDelegate(QObject* parent = 0) : QItemDelegate(parent) { } QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const {原创 2023-10-25 21:16:48 · 1817 阅读 · 0 评论 -
《QT从基础到进阶·九》菜单,菜单栏,工具栏创建
另一种方法创建菜单:QMenu* file = menuBar()->addMenu(tr(“文件”));//这样可以默认已经有菜单栏了,在菜单栏上创建一个文件的菜单。setShortcuts设置快捷键,比如QKeySequence::Open,可以通过ctrl+o实现这个按钮功能。setStatusTip设置状态栏提示,鼠标放在这个按钮上状态栏会显示提示信息。QMenu插入不同的QAction后可以连接信号槽,点击QMenu里的菜单触发。原创 2023-10-25 17:56:21 · 88 阅读 · 0 评论 -
《QT从基础到进阶·八》QDockWidget使用
/允许悬浮窗摆放的区域,右边或上边。也可以打开程序时让悬浮窗隐藏,dock->hide();注意:如果不设立addDockWidget停靠位置,悬浮窗会默认悬浮在主窗口之下,如图。想要悬浮窗悬浮在主窗口之上需要加dock->setFloating(true);原创 2023-10-25 16:57:51 · 482 阅读 · 0 评论 -
《QT从基础到进阶·七》QTableView的使用
这个就相当于自定义控件DisplayWidget类,继承QTableView, 创建DisplayWidget对象时就相当于创建QTableView对象,内部实现中数据模型不需要指定挂载到哪个表格上,本身DisplayWidget已经继承了QTableView,代表是一个表格,内部的数据模型自然是挂载到这个类上,只要创建DisplayWidget对象,表格就能显示。原创 2023-10-25 16:34:52 · 325 阅读 · 0 评论 -
《QT从基础到进阶·六》布局及布局中的小部件排列
/注意,这只是把widget从布局中移除了,但打开界面看布局中的widget还在,那是因为widget还和centralWidget有父子关系,必须断开,widget->setParent(NULL);Layout是一种各种UI都很长用的布局手段,Qt的就很不错,比如说GridLayout,你可以把整个窗体布局一个GridLayout,然后再往GridLayout里面放控件或者其他布局,这种布局的手段可以随窗体变化而改变布局内的控件的大小,而相对的位置不变。//改变布局里组件的排放循序,0位置插入滑块。原创 2023-10-25 15:42:06 · 321 阅读 · 0 评论 -
《QT从基础到进阶·五》组件与组件或布局与布局的重叠问题
(new QPushButton(ui.centerWidget))的时候依附的父类一定是centerWidget不能是QMainWindow,不然容易导致布局内组件重叠。(布局与布局的间距或布局内组件与组件的间距)可解决重叠问题。设置布局内组件离上下左右边界的距离:layout->setContentsMargins(0, 0, 0, 0);组件设置固定的宽高容易导致布局内的组件重叠,或者布局与布局之间组件重叠。设置布局内组件与组件距离或布局与布局距离:setSpacing();原创 2023-10-25 13:39:28 · 546 阅读 · 0 评论 -
《QT从基础到进阶·四》信号槽的多种连接方式
(3)如果出现connect连接时报不明确的问题,那是因为QT不允许多继承情况下,多个父类继承QObject,需要加QObject::connect()作用域。点击按钮触发clicked信号,又因为按钮信号连接了demo类的信号,所以触发clicked信号后会触发trigger信号,最后触发func槽函数。(2)同一个信号槽connect连接多次问题:connect连接多次,发一次信号,槽函数会被执行多次。(1)如果信号发生重载就不可以直接用作用域的方式连接,因为无法判断传递什么类型的参数。原创 2023-10-25 11:12:55 · 260 阅读 · 2 评论