使用Qt进行程序开发的过程记录

目录

一、qt的安装

二、resources文件的使用

三、Qt中各种设置问题

四、在子页面的简单图表显示

五、Qt发布独立运行的exe的方法

六、Qt创建子页面的方法

七、Qt中使用菜单栏的方法

八、Qt联合C++进行文件读取、写入操作

九、Qt关闭窗口函数

十、提示窗口与调试功能的使用

十一、Label控件的使用

十二、Input类型 Line Edit控件的使用

十三、Push Button控件的使用

 十四、Display类型 Text Browser控件的使用

十五:遇到的调试时间很长的bug


一、qt的安装

1.下载qt,从下面网址选择qt6以下的版本,并选择win安装版本,大小在2.4gb左右

https://download.qt.io/archive/qt/

在安装器内选择安装所有

安装过程中会有错误跳出

手动在提示文件夹下安装后点击 ignore即可

开发在Qt Creater下进行开发即可

如果需要引用外部库文件,则需要在工程的.pro文件下添加外部库文件的绝对路径后再进行引用

如:

INCLUDEPATH += E:\eigen-3.3.9

二、resources文件的使用

当设计ui时需要用到图片、以及需要加载图标、音乐时,需要先创建qrc资源文件

 同时要把所有资源文件先放在与main.cpp同文件下

在.qrc文件下先创建一个新的文件夹

再右击点击添加现有文件进行添加

如果.qrc文件过大,则会遇到编译器报错,这时需要在.pro内添加以下代码

CONFIG += resources_big

三、Qt中各种设置问题

1.设置运行时的图标与标题

    this->setWindowTitle("最优估计课程设计程序");setWindowIcon(QIcon(":/new/diqiu.ico"));

2.设置资源管理器内的图标

首先创建rc文件

 注意:.rc的后缀要自己书写

将图标放入工程项目文件夹内

在.rc文件中写入如下代码:

IDI_ICON1 ICON  DISCARDABLE "diqiu.ico"

在.pro文件内添加如下代码:

RC_FILE += icon.rc

3.设置想要显示的静态图片,这里使用

Label控件完成

图片的加载:在resource文件内选择需要的图片

 点击下方的scaledContents可自适应图片

4.设置软件BGM

1)在.pro文件内填写代码

QT       += multimedia

 2)在主页面的头文件内填写代码

#include <QSound>

3)在.qrc文件内添加.wav格式的音频文件

4)在主页面内写入代码

    QSound::play(":/new/cszx.wav");

四、在子页面的简单图表显示

首先在.pro文件内添加以下代码

QT       += charts

在需要显示图表的页面的头文件内添加以下头文件

#include <QChartView>
#include <QLineSeries>
#include <QValueAxis>
QT_CHARTS_USE_NAMESPACE

主界面代码:

void MainWindow::Draw_Y()
{if(POS.size()==4){QMessageBox::warning(this,"警告","请先进行解算");}else{drawyy *drawyyw=new drawyy(POS,geshu,APPROX_POSITION);//Form *formw = new Form(POS,geshu,APPROX_POSITION);//formw=new Form;drawyyw->show();}
}

子页面代码:

drawyy::drawyy(Eigen::MatrixXd POS1, int geshu1, double *APPROX1, QWidget *parent) :QMainWindow(parent),ui(new Ui::drawyy)
{ui->setupUi(this);this->setWindowTitle("Y绘图");//设置子页面标题setWindowIcon(QIcon(":/new/diqiu.ico"));//设置子页面图标POS=POS1;geshu=geshu1;//引用主函数数据//qDebug()<<POS.size()<<endl;//qDebug()<<APPROX1[1]<<endl;//qDebug()<<POS1(0,0)<<endl;//qDebug()<<POS(0,0)<<endl;QChartView* ydraw=new QChartView(this);//创建图表显示类QChart* chart=new QChart();//创建图表类ydraw->setChart(chart);setCentralWidget(ydraw);//设置图表自适应//formw->show();QLineSeries* Drawy=new QLineSeries;//创建折线类Drawy->setName("Y坐标");//设置图例chart->addSeries(Drawy);for(qreal a1=0;a1<=geshu-1;a1++){//Drawy->append(a1,(1));//POS(0,a1)/1000000)//*series << QPointF(11, 1)*Drawy<<QPointF(a1,POS(1,a1));//设置要显示的数据}QValueAxis* axisX=new QValueAxis;//设置X坐标轴axisX->setRange(1,geshu);//设置X坐标轴范围chart->setAxisX(axisX,Drawy);//规定绘图区域在范围内int APPROX2=APPROX1[1];QValueAxis* axisY=new QValueAxis;//设置Y坐标轴axisY->setRange(APPROX2-15,APPROX2+15);//(APPROX1[0]+15)/1000000,//设置Y坐标轴范围(APPROX1[0]-15)/1000000chart->setAxisY(axisY,Drawy);//规定绘图区域在范围内
}

五、Qt发布独立运行的exe的方法

1.首先在生成的地方选择编译的工具,并且选择release

 2.将生成出来的exe单独放在一个文件夹内

3.找到Qt中自带的编译工具(注意名字要与第一步相同,如第一步使用的是MinGW,则在这一步也要使用MinGW

将路径设为第二步的文件夹

输入以下命令:

windeployqt ***.exe

 回车后等待自动生成dll文件

之后只需要将该文件夹打包发布软件就能独立运行了

六、Qt创建子页面的方法

点击新建文件

新建一个Q他设计师界面类

 选择默认模板,并起好相应的名称

 在主函数里对想要传入的参数进行修改,注意:所有自定义参数要写在原有参数的前面,然后点击右侧的灯泡💡,会自动跳转到头文件,并对头文件中的函数进行改写,之后在页面函数内书写需要的功能即可

 在private内定义函数需要使用的变量

 当需要使用子页面时,需要用new函数来把子页面创建在堆区,防止主页面内的函数结束后,子页面自动被销毁,使用时先进行传参,然后使用show()函数进行显示即可

drawxx *drawxxw=new drawxx(POS,geshu,APPROX_POSITION);//Form *formw = new Form(POS,geshu,APPROX_POSITION);//formw=new Form;drawxxw->show();

七、Qt中使用菜单栏的方法

由于菜单栏无法直接使用“转到槽”功能,因此需要手动书写头文件、连接函数、功能函数,菜单栏工具条属于menubar类,上面的每个选项属于menubar类下的menu类,选项内的选项为action类,一般为了实现按钮的功能,需要把功能写在action类中

PS:为了实现快捷键操作,在书写完功能名称后,可在后面写入,如:(&F),这样在问中进行操作时,就可使用Alt+F来进行快捷操作

在.ui文件中修改好相应的参数并对相应的功能类名重命名之后,进行以下操作

1.在头文件的private slots:下创建想要实现的功能的函数名

private slots:void lineclear();void daoru();void baocun();void guanbi();void xinxi();void Draw_X();void Draw_Y();void Draw_Z();

2.在主ui函数内填写连接函数

    connect(ui->guanbi,&QAction::triggered,this,&MainWindow::guanbi);connect(ui->daoru,&QAction::triggered,this,&MainWindow::daoru);connect(ui->baocun,&QAction::triggered,this,&MainWindow::baocun);connect(ui->action_2,&QAction::triggered,this,&MainWindow::xinxi);connect(ui->Draw_X,&QAction::triggered,this,&MainWindow::Draw_X);connect(ui->Draw_Y,&QAction::triggered,this,&MainWindow::Draw_Y);connect(ui->Draw_Z,&QAction::triggered,this,&MainWindow::Draw_Z);

具体格式为,connect(哪个类,发出了什么信号,由谁,执行什么信号)

3.再直接在下面创建相应的功能函数

QString fileName = QFileDialog::getOpenFileName(this,"请选择一个文件",QCoreApplication::applicationFilePath(),"*.txt");
void MainWindow::Draw_Z()
{if(POS.size()==4){QMessageBox::warning(this,"警告","请先进行解算");}else{drawzz *drawzzw=new drawzz(POS,geshu,APPROX_POSITION);//Form *formw = new Form(POS,geshu,APPROX_POSITION);//formw=new Form;drawzzw->show();}
}

八、Qt联合C++进行文件读取、写入操作

由于使用Qt函数进行创建、读取文件时返回的是QString类型的绝对路径,因此需要转为String格式的绝对路径才能给C++自带的文件读写函数进行使用

首先加入头文件

#include <QFileDialog>

1.文件读取

QString fileName = QFileDialog::getOpenFileName(this,"请选择一个文件",QCoreApplication::applicationFilePath(),"*.txt");

函数参数解释:(指定主页面,选择提示的内容,选择刚打开时默认的路径(以上代码中为软件所在路径),默认打开的文件格式)

使用过程中可配合empty函数来判断是否读取到文件路径

    QString fileName = QFileDialog::getOpenFileName(this,"请选择一个文件",QCoreApplication::applicationFilePath(),"*.txt");if(fileName.isEmpty()){QMessageBox::warning(this,"警告","请选择一个文件");}else{qDebug()<<fileName;}

使用以下代码将QString格式的路径转换为String格式

string filename=fileName.toStdString();

使用C++文件操作函数进行操作

std::ifstream file;file.open(filename);std::getline(file, line);

2.文件保存

QString baocun=QFileDialog::getSaveFileName(this,"保存文件",QCoreApplication::applicationFilePath(),"*.txt");

函数参数解释:(指定主页面,选择提示的内容,选择刚打开时默认的路径(以上代码中为软件所在路径),默认保存的文件格式)

使用过程中可配合empty函数来判断是否读取到文件路径

if(baocun.isEmpty()){QMessageBox::warning(this,"警告","请选择一个文件");}else{qDebug()<<fileName;}

使用以下代码将QString格式的路径转换为String格式

string baocun2=baocun.toStdString();

使用C++文件操作函数进行操作

        ofstream ans;ans.open(baocun2,ios::out);//ifstream file;//FILE *ans = file.open(baocun2);//fopen(baocun2, "w+");ans<<'\t'<<"X坐标"<<'\t'<<"Y坐标"<<'\t'<<"Z坐标"<<'\t'<<"X改正数"<<'\t'<<"Y改正数"<<'\t'<<"Z改正数"<<'\r'<<'\n';

注:ios::std为完全覆写模式

九、Qt关闭窗口函数

this->close();

十、提示窗口与调试功能的使用

先添加头文件:

#include <QMessageBox>
#include <QDebug>

MessageBox的使用:

QMessageBox::warning(this,"警告","错误,超出最多解算个数");

参数解释:(指定主页面(继承父类),提示框左上角提示内容,提示框提示内容)

qDebug的使用:类似于cout

qDebug()<<POS1(0,0)<<endl;

十一、Label控件的使用

Label控件既能显示文字,也能显示图片,显示图片的方法在三中以提到,Label控件中文字的属性可以在控件的QWidget的font属性中进行设置

十二、Input类型 Line Edit控件的使用

Line Edit内可输入各种类型的数据,但读入时为QString类型,如果需要数字类型,需要转为对应的数据类型才可以进行计算

获取Line Edit内的数据方法如下:

QString geshu1;
geshu1=ui->lineEdit->text();

所有的主函数内的控件使用时都需要用ui->

转为整型数据类型:

 geshu=geshu1.toInt();

十三、Push Button控件的使用

在页面上编辑完成,并修改类名之后,右键选择 “转到槽“ 可自动生成函数,当按钮被按下,或被执行相应的操作后,会自动执行函数内的代码

void MainWindow::on_LSM_Button_clicked()
{}

 十四、Display类型 Text Browser控件的使用

1.输出字符串

ui->textBrowser->insertPlainText("开始解算");

2.结束一行的输出,并输出回车

ui->textBrowser->moveCursor(QTextCursor::End);
ui->textBrowser->append(QString(""));

3.清空输出

ui->textBrowser->clear();

4.数字变量的输出

注:insertPlainText()函数默认输出的是QString格式的数据,不能直接输出数字类型,需要将数字类型转换为QString类型才可以进行输出

ui->textBrowser->insertPlainText(QString::number(k+1,'f',0));

函数解释,k+1为要输出的变量‘f’为输出的类型,0表示保留小数后多少位


十五:遇到的调试时间很长的bug

 1.刚开始写代码,调用矩阵内的元素时经常遇到调用超限的报错

原因及解决方法:C++中默认从0开始计数Eigen的矩阵本质上也是数组,因此也从0开始计数,如果定义MatrixXd X(2,2),则第一个元素是X(0,0),最后一个元素是X(1,1)

2.调试时每个循环输出相同的结果

原因及解决方法:错误的将计数变量进行+1操作而非循环变量

 一开始写的是for (int a1=0;a1<=i;i++)

实际应该是for(int a1=0 ; a1<=i; a1 ++)

3.关于C++的文件输出,转意字符要用单引号输出

4.关于Eigen的传参,一般使用指针进行传参

使用方法:

使用实例:

 主函数:

double APPROX_POSITION[3];//全局变量
double X0=0, Y0=0, Z0=0;//全局变量存储接收机位置
MatrixXd POS(2, 2);//创建坐标结果矩阵
MatrixXd ANS(4, 1);
int geshu;drawyy *drawyyw=new drawyy(POS,geshu,APPROX_POSITION);//函数调用

子函数:

drawxx::drawxx(Eigen::MatrixXd POS1, int geshu1, double *APPROX1, QWidget *parent) :
{POS=POS1;geshu=geshu1;
}

5.Qt绘图时出现坐标轴范围无法用变量定义的bug

Qt的坐标轴范围定义函数使用变量时只能用整数或string进行定义,如果必须使用小数 可以进行手动输入,如图所示

 若如下图所示,则变量必须为整型变量

6. setCentralWidget();函数

setCentralWidget();函数属于 mainwindow类,不能在widge内进行使用,因此绘制自适应图表时应使用mainwindow类而非位widge

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52051.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt开发技术:Qt绘图系统(二)QPainter详解

若该文为原创文章&#xff0c;未经允许不得转载 原博主博客地址&#xff1a;https://blog.csdn.net/qq21497936 原博主博客导航&#xff1a;https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/…

Qt绘图与信号事件

Qt应用开发的基本模式(面向对象) 继承QDailog gkdialog.h #ifndef GK_DIALOG_H #define GK_DIALOG_H #include <QtWidgets/QDialog>class GKDialog: public QDialog{ public:GKDialog(QWidget *parent0);~GKDialog(); }; #endifgkdialog.cpp #include "gkdialog…

我的Qt作品(9)Qt使用Cairo绘图引擎提升抗锯齿效果【开源】

之前写了一篇文章《Qt使用GDI绘图&#xff08;仅Windows平台&#xff09;》 Qt使用GDI绘图&#xff08;仅Windows平台&#xff09;_libaineu2004的博客-CSDN博客 本篇重点介绍Cairo绘图引擎&#xff0c;Qt自带的QPainter的绘图效率和抗锯齿效果都没有cairo的好。cairo 的目标…

基于Qt的多媒体综合应用程序设计(2)

框架结构图等 1.多媒体综合应用程序设计思路 首先创建一个Qt Widgets Application程序,在头文件中完成类、函数及变量的设置,在程序窗口中添加相应的控件,利用控件的属性和方法分别实现文字处理程序跳转、绘图程序跳转、图像处理程序跳转、音频播放器跳转、视频播放器跳转和…

VS+Qt+鼠标框选后掩膜去除背景

前言&#xff1a; 实际采集的图片背景比较复杂&#xff0c;所以我想着采用框选矩形框掩膜的方式简单粗暴的消除背景对图片有用区域的干扰。网上搜索了一圈尝试了几种不同的方式去框选&#xff0c;最后发现还是Qt的鼠标事件比较容易上手。 效果图&#xff1a; 主要思路&#x…

QT—3D绘图

OpenGL是一个跨平台的、用来渲染3D图形的标准API,Qt对OpenGL提供了强大的支持。Qt4时代的QtOpenGL模块在Qt5中已经不再建议使用,OpenGL相关的类被移到了Qt GUI模块。Qt Widgets模块中的QOpenGLWidget类提供了一个可以渲染OpenGL图形的部件&#xff0c;通过该部件可以轻松地将Op…

【Qt】Qt环境配置与入门案例

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Qt环境配置与入门。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&…

(三)NI采集卡应用学习:在Qt中实现多路数据的同时采集、显示、绘图及存储

1、使用NI MAX创建多路输入的测量任务 本处设置Dev1/ai0:3四路电压输入&#xff0c;采样率均为100&#xff0c;差分连接。 2、代码 // 设置地址 void Widget::on_add_pushButton_clicked() {address_txt QFileDialog::getExistingDirectory(this, tr("Open Directory&q…

linux程序框架设计,《Linux与Qt程序设计》知识框架

本文主要是通过一本书来大致了解Qt开发的框架,不对具体内容做详细分析。 1.首先弄清楚概念:定义->以自己的话理解是什么-> 实现的是什么功能->用在哪些地方 2.前面认识到的知识点的特点-> 代码实现-> 工程代码分析 第一部分 Linux基础知识 第二部分 Qt程序基础…

QT开发应用程序(11)--图形绘制和文本输出

代码演示&#xff1a; #include <QPainter> MyDraw::MyDraw(QWidget *parent) :QWidget(parent) {QLinearGradient linearGradient(0,0,400,400);linearGradient.setColorAt(0.0,Qt::white);linearGradient.setColorAt(0.2,QColor(0,0,0));linearGradient.setColorAt(1.…

chatgpt赋能python:使用Python捕获错误:为您的代码添加可靠性

使用Python捕获错误&#xff1a;为您的代码添加可靠性 在编写Python代码时&#xff0c;错误很常见。您可能会因输入无效参数而收到TypeError&#xff0c;或者因无法连接到数据库而收到ConnectionError。当这些错误发生时&#xff0c;您的代码可能会崩溃或产生不正确的结果。尽…

chatgpt赋能python:关闭Python:如何优雅地退出一个Python程序

关闭Python&#xff1a;如何优雅地退出一个Python程序 Python作为一门开发语言&#xff0c;可以广泛应用于众多领域&#xff0c;如数据科学、人工智能、Web应用开发等等。但有时候&#xff0c;我们需要关闭一个正在运行的Python程序。本文将介绍如何优雅地退出一个Python程序&…

chatgpt赋能python:Python异常捕获存在的问题

Python 异常捕获存在的问题 作为一门广受欢迎、应用广泛的编程语言&#xff0c;Python 在处理异常方面有着比较完善的设计。Python 提供了 try…except…finally 这样的异常处理机制&#xff0c;通过这些机制&#xff0c;开发者可以捕获、处理程序中产生的异常&#xff0c;从而…

yagmail——快速发送邮件

yagmail——快速发送邮件 目标&#xff1a;如何利用python中的yagmail包&#xff0c;快速发送邮件。 python写的一个简单demo脚本代码如下&#xff1a; import yagmail import pandas as pd from loguru import logger# 保存excel文件 contents pd.DataFrame() contents[&quo…

电脑和微信怎么发邮件到别人邮箱,企业邮箱如何发email给别人

邮箱已成为主流的办公软件&#xff0c;除了日常的电脑办公使用以外&#xff0c;你知道还有哪些便捷的方式使用邮箱吗&#xff1f;现在是互联网时代&#xff0c;许多邮箱都研发了手机邮箱配合使用&#xff0c;那TOM企业邮箱有哪些便捷的服务呢&#xff1f;一起看看吧&#xff01…

怎么发送电子邮件到别人邮箱?手把手教你!

在日常生活中&#xff0c;我们在工作学习的时候都离不开电子邮件&#xff0c;无论两人的距离有多远&#xff0c;都是可以通过电子邮件的方式完成信息的即时传递。这样不仅可以传输文字信息&#xff0c;还能传输图片、视频等多种格式的信息。那么&#xff0c;怎么发送电子邮件到…

chatgpt赋能Python-pythonapp自动化

Python App自动化&#xff1a;优化SEO的终极解决方案 随着互联网的发展&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;变得日益重要。对于任何网站或应用程序开发人员来说&#xff0c;SEO应该是一个非常重要的考虑因素。为了帮助开发人员和企业提高其在线可见性&#x…

chatgpt赋能python:Python自动化断言介绍

Python 自动化断言介绍 软件业的各种应用程序不可避免地需要与用户进行交互。测试团队应该确保这些应用程序快速&#xff0c;可靠地响应用户交互&#xff0c;并注重高质量测试的策略和工具。Python自动化断言是一种测试策略&#xff0c;可帮助团队实现高品质和高效率的测试。P…

chatgpt赋能python:Python自动化操作桌面的方法和应用

Python自动化操作桌面的方法和应用 Python是一种高级编程语言&#xff0c;越来越多的研究人员和程序员将其应用在自动化操作任务上。本文将向您介绍如何利用Python自动化操作桌面并且展示一些实际应用。 桌面自动化操作是什么&#xff1f; 桌面自动化操作是使用编程语言编写…

chatgpt赋能python:Python表格自动化:优化你的数据处理工作效率

Python表格自动化&#xff1a;优化你的数据处理工作效率 作为一名有10年Python编程经验的工程师&#xff0c;我深切体会到编程能够为我们带来的高效和便利。其中&#xff0c;Python在数据分析和处理方面的优势尤为突出。本文将从Python表格自动化的角度&#xff0c;为大家介绍…