QT QFrame 边框设置
需求 qt QFrame 需要能够边框明显一些,方便各个区域能够对比明显。 解决 在 designer 中,设置 QFrame 的 frameShape 从默认的 StylePanel 改为 Box, 就可以非常明显的看出来边框了,如果还需要进一步设置阴影,那么可以设置 frameShadow 为 Sunken, lineWidth 为 5, midLineWidth 为 10. 参考 《Qt Creator 快速入门 第二版》 P63
需求 qt QFrame 需要能够边框明显一些,方便各个区域能够对比明显。 解决 在 designer 中,设置 QFrame 的 frameShape 从默认的 StylePanel 改为 Box, 就可以非常明显的看出来边框了,如果还需要进一步设置阴影,那么可以设置 frameShadow 为 Sunken, lineWidth 为 5, midLineWidth 为 10. 参考 《Qt Creator 快速入门 第二版》 P63
需求 qt 需要在 QChartView 被点击时,跳转详情页面。 解决 其实也简单,只需要 override mousePressEvent 即可。 新建一个类 public 继承 QChartView 在这个类里面重写 mousePressEvent, 每当按下的时候发出 Press 的信号 在前一个页面的代码中绑定 Press 这个信号和详情的页面。 这样就可以在点击图表的时候,发出信号,触发详情页面的打开。 #ifndef CHARTBRIEFVIEW_H #define CHARTBRIEFVIEW_H #include <QWidget> #include <QtCharts/QChartGlobal> #include <QtCharts/QChartView> QT_CHARTS_BEGIN_NAMESPACE class QChartView; class QChart; QT_CHARTS_END_NAMESPACE QT_CHARTS_USE_NAMESPACE class ChartBriefView : public QChartView { Q_OBJECT public: ChartBriefView(QChart *chart, QWidget *parent = nullptr); signals: void Press(int id); private: void mousePressEvent(QMouseEvent *event) override; }; #endif // CHARTBRIEFVIEW_H #include "chart_brief_view.h" #include <QDebug> ChartBriefView::ChartBriefView(QChart *chart, QWidget *parent) : QChartView(chart, parent) { } void ChartBriefView::mousePressEvent(QMouseEvent *event) { qDebug() << "chart view press" << Qt::endl; emit Press(0); } connect(chartView, &ChartBriefView::Press, this, &ControllerForm::ClickSensor); 参考 QtCharts图形移动和缩放...
需求 qt 在使用 connect 连接时,有些时候因为类型匹配的问题,会报错: QPushButton * controller_button_[APP_NUM_OF_CONTROLLER]; QSignalMapper * signalMapper_; signalMapper_ = new QSignalMapper(this); for (int i = 0; i < APP_NUM_OF_CONTROLLER; i++) { controller_button_[i] = new QPushButton(this); connect(controller_button_[i], &QPushButton::clicked, signalMapper_, &QSignalMapper::map); signalMapper_->setMapping(controller_button_[i], i); } connect(signalMapper_, &QSignalMapper::mapped, this, &MainWindow::ClickDetail); mainwindow.cpp:173:9: error: no matching member function for call to 'connect' qobject.h:222:36: note: candidate function not viable: no known conversion from 'void (QAbstractButton::*)(bool) __attribute__((thiscall))' to 'const char *' for 2nd argument qobject....
需求 最近想了解下 进度条。 解决 QT–进度条 参考
需求 最近想了解下 线程池。 解决 QT 多线程之线程池QThreadPool(深入理解) 参考
需求 qt 在 tcp 编程时,希望 server 多线程来处理多个客户端的连接。 解决 多线程来处理连接的时候,还是 override incomingConnection 比较方便。主要是两个方面的工作: 创建新的 TcpSocket 方便处理数据 每个线程用来维护多个客户端 参考 QT的TCP连接多线程实现 QT编写TCP/UDP调试助手之多线程TCP服务器 Qt多线程 TCP 服务端 QT学习:QTcpServer多线程实现 QTcpServer多线程实现 iap_download QT编写TCP/UDP调试助手之多线程TCP服务器
需求 qt 在 tcp 编程时,希望 server 是多连接的,可以同时连接多个 client 解决 服务器接到新客户端连接后,会分配一个 SocketDescriptor, 然后 emit newConnection(), 服务器收到新信息,会 emit readRead(). 但是上面这两个信号都不会传递 SocketDescriptor, 所以无法分辨客户端。 override incomingConnection 重写 incomingConnection 可以获取 socketDescriptor, 然后继承 QTcpSocket 新建一个 tcp 的类,来获取 socketDescriptor. 虽然比较麻烦,但是后面多线程处理会比较方便。 nextPendingConnection nextPendingConnection 可以获取新连接的客户端,但是也是得不到 SocketDescriptor, 不过可以通过 QTcpSocket 的 peerAddress() 和 peerPort() 来获取客户端的 ip 和 端口,可以作为分辨客户端的依据。 readyRead 也可以使用 QTcpSocket::readyRead 这个信号来绑定 lambda 接收并回复的表达式。 参考 QT TCP网络编程 QT 之TCP网络编程(非常值得看的一篇博客!) QT TCP服务端如何判断客户端已断开连接 qt之QAbstractSocket incomingConnection qtcpsocket 【QT实现TCP数据发送和接收】
需求 最近在做一个 tcp demo 的时候,发现直接 read 没有问题,但是当使用 QDataStream 的 commitTransaction 来读取,返回的就是 false 这个就比较奇怪。 解决 通过 wireshark 抓包,发现 server 数据是已经发出来了,只是 client 解析错误。重新检查发送部分的代码,经过调整后,发现,向 QDataStream 里面写数据的时候,只能写 QString, 如果直接写字符串,就会读取错误。直接对比两种情况的打印,也发现,确实两种情况下,保存到 QByteArray 中的数据是不一样的。 参考 Question about QDataStream and its functions startTransaction and commitTransaction QIODevice 类 - 什么是设备? 什么是序列化? Serializing Qt Data Types QDataStream 类 - 序列化工具
需求 qt 中 slot 可以有两种形式,一种是单独的一个函数,还有一种是 lambda 表达式,那么他们所属的线程是什么呢? 解决 单独的槽函数,所属线程是主线程 lambda 表达式,所属线程是发送信号对应的子线程。 参考 换了多种方法,还是没完美解决、、、
需求 qt 多线程编程时,经常碰到 QObject: Cannot create children for a parent that is in a different thread . 解决 正常就两种方法解决: 把这个 QObject 放到子线程中的 run 里面去创建和执行。 使用 moveToThread 把这个 QObject 转移给子线程。 参考 简单例子理解 Qt 中 QObject: Cannot create children for a parent that is in a different thread. 问题 【Qt】Qt出现QObject: Cannot create children for a parent that is in a different thread.问题 (Parent is QSerialPort(0x4ab1ab0), parent‘s thread is QThread(0xbe3860)……问题解决办法 Qt Socket多线程编程出现的问题