QT QGroupbox 边框设置

需求 qt QGroupBox 自带的边框颜色非常淡,和 QFrame 的 frameShape 中的 Box 颜色相差太大了。希望修改边框,能够整体契合一些。 解决 QGroupBox 没有 frameShape, 只能通过 styleSheet 的配置来达到效果。在 designer 中如下设置 stypeSheet 即可和 QFrame 合拍。 QGroupBox{ border-width:1px; border-style:solid; border-color:gray; margin-top:0.5ex; } 如果还想要圆角矩形之类的,那么需要这样设置: QGroupBox{ border-width:2px; border-style:solid; border-radius: 10px; border-color:gray; margin-top:0.5ex; } 当然也可以在代码中使用如下的格式来进行配置: ui->groupBox->setStyleSheet("background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #E0E0E0, stop: 1 #FFFFFF);" " border-radius: 5px; margin-top: 1ex; ");//border: 2px solid gray; 参考 QGroupBox 显示边框 圆角边框 linux环境 QGroupBox设置边框

2023-07-05 · 1 min · 69 words · RamLife

QT QFrame 边框设置

需求 qt QFrame 需要能够边框明显一些,方便各个区域能够对比明显。 解决 在 designer 中,设置 QFrame 的 frameShape 从默认的 StylePanel 改为 Box, 就可以非常明显的看出来边框了,如果还需要进一步设置阴影,那么可以设置 frameShadow 为 Sunken, lineWidth 为 5, midLineWidth 为 10. 参考 《Qt Creator 快速入门 第二版》 P63

2023-07-05 · 1 min · 31 words · RamLife

QT QChartView 点击跳转详细大图

需求 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图形移动和缩放...

2023-07-05 · 1 min · 104 words · RamLife

QT connect signal 和 slot 类型匹配

需求 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....

2023-07-05 · 2 min · 278 words · RamLife

QT 进度条 介绍

需求 最近想了解下 进度条。 解决 QT–进度条 参考

2023-07-05 · 1 min · 6 words · RamLife

多进程,多线程了解

需求 最新希望了解一下,多进程和多线程分别适用的场景 解决 多进程适合 CPU 密集型任务:如果应用程序需要大量的 CPU 计算,并且没有太多的 I/O 操作,则使用多进程可能更加适合。这是因为每个进程都有自己的 CPU 时间片,可以并行执行,从而提高整个应用程序的性能。 隔离性:如果应用程序需要隔离不同的任务或数据,以确保它们不会相互影响,则使用多进程可能更加适合。每个进程都有自己的地址空间和资源,因此不同的进程可以独立运行,互相不会干扰。 多线程适合 I/O 密集型任务:如果应用程序需要大量的 I/O 操作(例如网络通信、磁盘读写等),则使用多线程可能更加适合。这是因为 I/O 操作通常是阻塞的,一个线程被阻塞时,另一个线程可以继续执行,从而提高整个应用程序的性能。 共享性:如果应用程序需要共享数据,并且需要在不同的任务之间共享数据,那么使用多线程可能更加适合。线程可以在同一地址空间内运行,它们可以访问相同的变量和数据结构,从而可以方便地共享数据。 轻量级任务:如果应用程序需要处理大量的轻量级任务,并且创建进程的开销太大,那么使用多线程可能更加适合。 参考 多线程和多进程的适用场景 一文弄懂多进程与多线程 多线程还是多进程的选择及区别

2023-07-03 · 1 min · 26 words · RamLife

消息队列和 socket 速度

需求 选择消息队列或者 socket 来传递信息,速度哪个快? 解决 长连接时, socket 比 queue 慢 10% 短连接时,速度更慢。 建议: 长连接,使用 socket,毕竟方便,效率也没有低太多。 短连接,使用 queue,或者数据库连接池。 参考 【本文已迁移到“程序员文摘” http://programmerdigest.cn/category/lajp】Linux下消息队列和socket绝对速度比拼 【转】Linux下消息队列和socket绝对速度比拼 数据库连接池学习笔记(一):原理介绍+常用连接池介绍 用消息队列和socket实现聊天系统

2023-06-29 · 1 min · 23 words · RamLife

多进程通信几种方式介绍

需求 多进程通信有哪几种方式? 解决 管道 命名管道 FIFO 使用 mkfifo 来创建管道文件。 不相关进程也可以通信。 匿名管道 使用 fork 来创建。只能用于父子进程。 消息队列 queue 保存在内核中的消息列表,如果没有释放,会一直存在。缺点时,不适合大数据的传输,单个消息有长度限制,全部消息总长度也有限制。 共享内存 同一块内存,多个进程都可以读写,可以省去复制的时间。但是如何管理多个进程的读写是个问题。 信号量 信号量可以用来管理共享内存,只有拿到信号量的才能进行读写。 信号 异常工作下的情况,就需要使用信号来进行干预了。比如说 ctrl-c 发出的 SIGINT 用来终止进程。 socket 可以用来本机之间不同进程的通信,也可以用作网络上不同主机之间的通信。 参考 {整理} Linux 进程间通信的方式、应用场景及优缺点 Linux进程间通信(IPC)的六种方式 一文搞懂六大进程通信机制原理(全网最详细) Linux进程间通信详解(最全)

2023-06-28 · 1 min · 36 words · RamLife

localhost, 127.0.0.1, ip 区别

需求 和本级进程通信的时候,使用 localhost, 127.0.0.1, 本级 ip 之间的区别? 解决 localhost 连 IP 都没有,不会有IP报头,只会有 TCP 报头。从上向下,经过 应用层,传输层。 127.0.0.1 有 IP,会有 IP 报头。 从上向下,经过 应用层,传输层,网络层。 参考 【IP/TCP】127.0.0.1和localhost和本机IP三者的区别

2023-06-27 · 1 min · 24 words · RamLife

c++ json 库 nlohmann json 转换异常 [json.exception.type_error.305]

需求 nlohmman 进行 json 转换时,报异常: [json.exception.type_error.305] cannot use operator[] with a string argument with array. 解决 转换为 json 异常 原因可能是,嵌套时,括号不匹配 void to_json(json& j, const VoltageConfigJson& config) { j = json{{"config_name", config.name}}; for (auto & cfg : config.data) { json channel; to_json(channel, cfg); j["config_data"].push_back(channel); } } 上面这个代码中,如果第一句写成下面这样,那么就会是 305 的异常。 j = json{"config_name", config.name}; 参考 {json.exception.type_error.305} cannot use operator{} with a string argument with array Cannot use operator{} with a string argument with string...

2023-06-26 · 1 min · 92 words · RamLife