news 2026/4/16 12:21:54

QT 学习:协同开发的程序如何汇总到主程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
QT 学习:协同开发的程序如何汇总到主程序

有时候任务是分不同人开发的,如何把结果汇总到一个界面呢?
或者有些好的类是自己封装后,可以无限复制使用,怎么挪到自己的主程序呢?
以下举个小例子记录一下,我也备份一下
说明:
我有一个派生类,继承于QWidget,功能是用来绘制折线图的(直接QT例子粘贴的)
还有一个主程序,MainWindow,里面有一个QWidget占位,用来绘制折线图
如何把折线图绘制的QWidget放置到主程序里面的QWidget呢?
继承类:

/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Charts module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 or (at your option) any later version ** approved by the KDE Free Qt Foundation. The licenses are as published by ** the Free Software Foundation and appearing in the file LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/#ifndefMAINWIDGET_H#defineMAINWIDGET_H#include<QtCharts/QChartGlobal>#include<QtCharts/QChart>#include<QtCharts/QChartView>#include<QtWidgets/QWidget>#include<QtWidgets/QGraphicsWidget>#include<QtWidgets/QGridLayout>#include<QtWidgets/QGraphicsGridLayout>#include<QtWidgets/QDoubleSpinBox>#include<QtWidgets/QGroupBox>#include<QtCharts/QLineSeries>QT_CHARTS_USE_NAMESPACEclassMainWidget:publicQWidget{Q_OBJECTpublic:explicitMainWidget(QWidget*parent=0);voidaddSeries();voidconnectMarkers();publicslots:voidremoveSeries();voiddisconnectMarkers();voidhandleMarkerClicked();private:QChart*m_chart;QList<QLineSeries*>m_series;QChartView*m_chartView;QGridLayout*m_mainLayout;QGridLayout*m_fontLayout;};#endif// MAINWIDGET_H
/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Charts module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 or (at your option) any later version ** approved by the KDE Free Qt Foundation. The licenses are as published by ** the Free Software Foundation and appearing in the file LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/#include"mainwidget.h"#include<QtCharts/QChart>#include<QtCharts/QChartView>#include<QtWidgets/QPushButton>#include<QtWidgets/QLabel>#include<QtCore/QDebug>#include<QtCharts/QLegend>#include<QtWidgets/QFormLayout>#include<QtCharts/QLegendMarker>#include<QtCharts/QLineSeries>#include<QtCharts/QXYLegendMarker>#include<QtCore/QtMath>QT_CHARTS_USE_NAMESPACEMainWidget::MainWidget(QWidget*parent):QWidget(parent){// Create chart view with the chartm_chart=newQChart();m_chartView=newQChartView(m_chart,this);// Create layout for grid and detached legendm_mainLayout=newQGridLayout();m_mainLayout->addWidget(m_chartView,0,1,3,1);setLayout(m_mainLayout);// Add few seriesaddSeries();addSeries();addSeries();addSeries();connectMarkers();// Set the title and show legendm_chart->setTitle("Legendmarker example (click on legend)");m_chart->legend()->setVisible(true);m_chart->legend()->setAlignment(Qt::AlignBottom);m_chartView->setRenderHint(QPainter::Antialiasing);}voidMainWidget::addSeries(){QLineSeries*series=newQLineSeries();m_series.append(series);series->setName(QString("line "+QString::number(m_series.count())));// Make some sine wave for dataQList<QPointF>data;intoffset=m_chart->series().count();for(inti=0;i<360;i++){qreal x=offset*20+i;data.append(QPointF(i,qSin(qDegreesToRadians(x))));}series->append(data);m_chart->addSeries(series);if(m_series.count()==1)m_chart->createDefaultAxes();}voidMainWidget::removeSeries(){// Remove last series from chartif(m_series.count()>0){QLineSeries*series=m_series.last();m_chart->removeSeries(series);m_series.removeLast();deleteseries;}}voidMainWidget::connectMarkers(){//![1]// Connect all markers to handlerconstautomarkers=m_chart->legend()->markers();for(QLegendMarker*marker:markers){// Disconnect possible existing connection to avoid multiple connectionsQObject::disconnect(marker,&QLegendMarker::clicked,this,&MainWidget::handleMarkerClicked);QObject::connect(marker,&QLegendMarker::clicked,this,&MainWidget::handleMarkerClicked);}//![1]}voidMainWidget::disconnectMarkers(){//![2]constautomarkers=m_chart->legend()->markers();for(QLegendMarker*marker:markers){QObject::disconnect(marker,&QLegendMarker::clicked,this,&MainWidget::handleMarkerClicked);}//![2]}voidMainWidget::handleMarkerClicked(){//![3]QLegendMarker*marker=qobject_cast<QLegendMarker*>(sender());Q_ASSERT(marker);//![3]//![4]switch(marker->type())//![4]{caseQLegendMarker::LegendMarkerTypeXY:{//![5]// Toggle visibility of seriesmarker->series()->setVisible(!marker->series()->isVisible());// Turn legend marker back to visible, since hiding series also hides the marker// and we don't want it to happen now.marker->setVisible(true);//![5]//![6]// Dim the marker, if series is not visibleqreal alpha=1.0;if(!marker->series()->isVisible())alpha=0.5;QColor color;QBrush brush=marker->labelBrush();color=brush.color();color.setAlphaF(alpha);brush.setColor(color);marker->setLabelBrush(brush);brush=marker->brush();color=brush.color();color.setAlphaF(alpha);brush.setColor(color);marker->setBrush(brush);QPen pen=marker->pen();color=pen.color();color.setAlphaF(alpha);pen.setColor(color);marker->setPen(pen);//![6]break;}default:{qDebug()<<"Unknown marker type";break;}}}

实现:
1.我原来不考虑主程序代码量、不考虑代码美观,我都是直接写到主程序里面了,但是这样代码太多了,不方便管理,所以要剥离出来,单独封装
2.在代码里面直接创建实例即可,这样的话,所有图标操作全部放到chart 实例中封装对应接口就行

if(!ui->widget->layout()){ui->widget->setLayout(newQVBoxLayout());}chart=newMainWidget(this);// 添加到布局ui->widget->layout()->addWidget(chart);// 可选:设置布局边距ui->widget->layout()->setContentsMargins(0,0,0,0);//调用的时候chart->addSeries();chart->connectMarkers();

3.或者更简单,在.ui中,找到占位的QWidget 控件,右键提升,写类名和头文件即可,后续调用就不需要代码了,只需要ui->widget占位的控件调用派生类的接口函数就行

ui->widget->addSeries();ui->widget->connectMarkers();


可以了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 20:49:14

Qwen3-4B-Instruct-2507长文本处理:80万汉字文档分析实战

Qwen3-4B-Instruct-2507长文本处理&#xff1a;80万汉字文档分析实战 1. 引言&#xff1a;为何选择Qwen3-4B-Instruct-2507进行长文本分析&#xff1f; 随着大模型在企业知识管理、法律文书解析、科研文献综述等场景的深入应用&#xff0c;长上下文理解能力已成为衡量模型实用…

作者头像 李华
网站建设 2026/4/7 3:34:52

3步搞定茅台自动预约系统:零基础配置实战手册

3步搞定茅台自动预约系统&#xff1a;零基础配置实战手册 【免费下载链接】campus-imaotai i茅台app自动预约&#xff0c;每日自动预约&#xff0c;支持docker一键部署 项目地址: https://gitcode.com/GitHub_Trending/ca/campus-imaotai 还在为每天手动抢茅台而烦恼吗&…

作者头像 李华
网站建设 2026/4/15 20:03:07

洛雪音乐免费播放器终极音源配置完整教程

洛雪音乐免费播放器终极音源配置完整教程 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 还在为音乐会员费用发愁&#xff1f;洛雪音乐免费播放器通过精心维护的音源接口&#xff0c;让你零成本畅…

作者头像 李华
网站建设 2026/3/31 10:35:15

Open Interpreter部署指南:云服务器安装教程

Open Interpreter部署指南&#xff1a;云服务器安装教程 1. 引言 1.1 本地AI编程的兴起与Open Interpreter定位 随着大语言模型&#xff08;LLM&#xff09;在代码生成领域的持续突破&#xff0c;开发者对“自然语言驱动编程”的需求日益增长。然而&#xff0c;主流AI编码工…

作者头像 李华
网站建设 2026/4/16 9:24:49

DeepSeek-R1应用场景:金融风控中的逻辑推理

DeepSeek-R1应用场景&#xff1a;金融风控中的逻辑推理 1. 引言 在金融风控领域&#xff0c;决策过程往往依赖于复杂的规则判断、异常模式识别以及多条件的逻辑推演。传统的规则引擎虽然可解释性强&#xff0c;但在面对模糊边界、非线性关联和动态变化的风险场景时显得僵化&a…

作者头像 李华
网站建设 2026/4/13 15:55:59

LogicAnalyzer实战指南:从信号捕获到协议分析的完整解决方案

LogicAnalyzer实战指南&#xff1a;从信号捕获到协议分析的完整解决方案 【免费下载链接】logicanalyzer logicanalyzer - 一个多功能逻辑分析器软件&#xff0c;支持多平台&#xff0c;允许用户捕获和分析数字信号。 项目地址: https://gitcode.com/GitHub_Trending/lo/logi…

作者头像 李华