2020-2021项目遇到的部分问题 编程语言C++ 编程软件QT

**
2020

信号和槽 03_SignalAndSlot2

**
//标准的信号和槽

  connect(&b1,&QPushButton::pressed,this,&MainWidget::close);
/*
 &b1   信号发出者
 &QPushButton::pressed      发出者的类名::信号的名字(信号名字是按F1)里面帮助文档 继承signal找到的
this    信号接收者
&MainWidget::close         接收者的类名::槽函数名称  把光标放在close按F1 显示slot 说明是槽函数

*/

//自定义槽函数
/*自定义槽,普通函数的用法
* Qt5:任意的成员函数,普通全局函数,静态函数
* 槽函数需要和信号一致(参数和返回值)
* 由于信号都没有返回值所以槽函数一定没有返回值
*/

connect(b2,&QPushButton::released,this,&MainWidget::mySlot); //指针b2不用再获取地址。直接包含地址信息

//帮助文档是[signal] void QAbstractButton::released() 没有返回值,没有参数 去头文件.H写void released();没有返回值,没有参数。
//定义mySlot 按下按钮 “123”变成“hahaha”

带参数的信号: 没有参数和两个参数
插入带参数的信号(摁住Ctrl+单击链接)

signals:
/*信号必须有signals关键字来声明
* 信号没有返回值,但是可以有参数
* 信号就是函数声明,只需声明,无需定义
* 使用:emit mySignal();
*/

void mySignal();    //   信号函数声明   函数在子窗口执行 去子窗口写connect函数
void mySignal(int,QString);      //两个参数的信号

Qt5 中文乱码问题

在.cpp文件最上面添加:

#pragma execution_character_set("utf-8")

彻底解决qt乱码以及汉字编码的问题(UTF-8/GBK)
//UTF-8包含世界所有国家需要用到的字符;GBK包含全部中文字符,GB2312简单中文;BIG5繁体中文

出现LNK2019 qt 未找到文件:mainwidget.obj 解决方法

build-xxx-Debug目录手动删除掉,然后重新编译即可

Qt打开项目提示no valid settings file could be found qt

no valid settings file could be found qt中文意思是
找不到有效的设置文件。
此时,只需要删除项目中的.user 文件,再打开,选择编译器,打开后再点configure project,重新配置,重新构建,就可以了。

添加静态库和动态库

之前的文章有写过

添加SDK头文件

复制SDK所有文件放进.pro文件同级目录,右键项目文件夹—添加现有文件—选择路径—添加----注:在引用头文件时,要添加头文件路径。
在这里插入图片描述

项目刚运行时异常中断

一般异常中断就是缺少库 静态库没配置好 或者少动态库
有两个问题;
1.只添加了静态库,没有添加动态库
2.编译器选择错误,这个程序只能用MSCV2015/2017编译器进行编译。
3.放到其他电脑后,少wpcap.dll;packet.dll (双击生成的.exe 在debug里面就会报错提示)
4.需要点击安装Win10Pacp文件夹中的对应内容。

更改编译器后,程序中文字符报错显示,包含换行符等字符显示错误

改两个地方:

  1. 改编码为UTF-8:编辑—Select Encoding—UTF-8—按编码保存
  2. 工具—选项—文本—行为—UTF-8—如果是UTF-8添加(第一步改成UTF-8,才能这个才能生效,两个要同时修改才可以)

bool二值类型

bool类型是二值类型,只有两个值:0和1:true和false

QT如何更改编译器

我需要的是把MinGW更换为MSVC2017-32bit 但是我的MSVC2017-32bit是灰色的,

工具—选项—kits—构建套件—点中这个选项 共更改了三个地方。

在这里插入图片描述

项目今天打开后,无法编辑 编译类型出错

用notepad++更改编译类型为UTF-8,改之前的名字,把这个重新放回来 同一个名字就可以

QWidget转HWND

QWidget *myWidget;
HWND hwnd;
hwnd=(HWND)myWidget->winId();

HWND转QWidget

QWidget *myWidget;
HWND hwnd;
myWidget=QWidget::find(hwnd);

int转化为QString

int num = 65;
QString ab = QString::number(num,10);  //十进制,为"65"
QString abc = QString::number(num,16);  //十六进制,为"41"
QString abcd = QString::number(num,2);  //二进制,为"1000001"

获取当前时间

**QDateTime current_date_time =QDateTime::currentDateTime()**;
//current data time 当前数据时间
**QString current_date =current_date_time.toString("yyyyMMddhhmmss");**
//到秒转化为字符串

SPrintf函数

char szStr[256] = {0};
 //Sprintf 将一个格式化的字符串输出到一个目的字符串 (目的字符串,  格式化字符串:%u十进制无符号整数 %s字符串)
sprintf(szStr, ("d:\\%u%u.jpg"),fileYear,fileName);
//由于年月日太长,分成两个参数,传参两次。

返回值问题

  1. 函数数据类型和返回值类型保持一致。(为什么要给截图定义返回值?因为函数运行结束后内部数据销毁,所用到的路径信息无法传到另一个窗口调用)
  2. 为什么返回值要用QString 因为第二个窗口调用时路径是QString然而路径szStr是char[256]型的。然后传char[256]总是出问题 char char* const char char[256]无法转换的问题。
    在这里插入图片描述
    在按钮槽函数下:返回值的调用
    在这里插入图片描述

更新第二个窗口(由于按下按钮截图,要显示新截的图,每次都要更新)

所以不能在头文件初始化,不然窗口就会固定
在按钮下面定义更新窗口
在这里插入图片描述
此处传参为实参 第二个窗口接收为形参

void captureImage::path(QString path)   //此处括号内部为形参。头文件要定义
{                                      //void path(QString path);
    QImage* img=new QImage;
    if(! ( img->load(path) ) ) //加载图像  path形参?实参?
    {
        QMessageBox::information(this,
                     tr("打开图像失败"),
                     tr("打开图像失败!"));
        delete img;

        qDebug()<<"lujing:"<<path;
        return;
    }
[添加链接描述](https://www.cnblogs.com/zhangxuechao/p/11709359.html)    ui->labelCapture->setPixmap(QPixmap::fromImage(*img));
}

字符串截取

字符串截取

//截取指定位置字符
QString str = "AT+LOC+LOCATION: 115.850441,33.004833";  
QString s = str.mid(6); //"+LOCATION: 115.850441,33.004833"  //从第六位后开始截  
QString s = str.mid(6, 9); //"+LOCATION"   //从第六位开始截取9位

多选框

QAbstractButton->checked 默认选中

存TextEdit文本编辑框的内容存成QString

QString beizhudata = ui->textEdit->toPlainText(); //存成字符串
QByteArray data = ui->textEdit_2->toPlainText().toUtf8(); //存成数据

由于找不到Qtxxxx.dll,无法继续执行代码

参考链接
编译器环境没有加载到环境变量
解决方案:
1.找到QT安装目录下所使用的编译器路径,例如我这个项目用的是MSVC2017 32对应的路径为:D:\Software\QT\QTanzhuang\5.14.2\msvc2017\bin
在这里插入图片描述
2.将其添加到系统环境变量中即可解决。
在这里插入图片描述

打包:release版本

请参考之前写过的文章

Release版本自动优化导致延时循环被优化

1.使用volatile关键字。使release不对这个变量进行优化。

2. uint
  volatile int i=100000000;   //555555555555555555555555   1000000000buxing
      QFileInfo file(npath);
//     Delay_MSec(5);
    while(i--)
{
 volatile uint j=80000000;   //volatile关键字 使release版本不对这个变量进行优化!!!
        while(j--);
        if(file.exists()==true)
        {
            qDebug()<<"cunzaima"<<npath;
            j=10000000;
            while(j--);
            break;
        }

带有返回值的函数,必须return!!!!

添加按钮,用默认浏览器打开网页

void MainWindow::on_pushButton_clicked()
{
  QDesktopServices::openUrl(QUrl("https://www.baidu.com"));
}

如果要选用固定浏览器打开网页,把固定浏览器设置为默认浏览器即可。

QFile读写文件

文档打开读/写操作命令说明:

描述
QIODevice::NotOpen未打开
QIODevice::ReadOnly以只读方式打开
QIODevice::WriteOnly以只写方式打开
QIODevice::ReadWrite以读写方式打开
QIODevice::Append以追加的方式打开,新增加的内容将被追加到文件末尾
QIODevice::Truncate以重写的方式打开,在写入新的数据时会将原有数据全部清除,游标设置在文件开头。
QIODevice::Text在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 \r\n
QIODevice::Unbuffered忽略缓存

QFileInfo 返回文件信息说明:

函数功能
qint64以下函数返回值为qint64
info.size()文件大小 单位(字节)
QString以下函数返回值为QString
info.fileName()文件名,不包含文件路径,如果返回文件名为乱码,说明文档编码格式不正确,QT读取格式为UTF-8,使用info.fileName().toUtf8().data()后即可
QString info.suffix()返回文件后缀 例如txt
info.absoluteFilePath()返回带有路径的文件名 例如c:/users/1.txt
info.absolutePath()返回文件绝对路径,不包含文件名 例如c:/users/
info.fileName()返回去除路径的文件名 例如1.txt
info.baseName()返回文件名 例如1

工程源代码:
1、.cpp包含以下头文件

#include <QFile>
#include <QFileDialog>	//弹出“打开文件”对话框声明
#include <QDateTime>
#include <QFileInfo>
#include <QMessageBox>	//弹出式对话框

2、.cpp中定义一个打开文件的按钮功能如下

void FileOpen::on_openButton_clicked()
{
    QString s = QFileDialog::getOpenFileName(this,"选择一个文件","/","TXT(*.txt)");
    ui->fileEdit->setText(s);							//在文本框中显示出文件路径
    QFile file(s);										//定义一个文件对象
    QFileInfo info(s);									//定义一个文件信息对象
    qint64 size = info.size();							//返回文件的大小
    if(size > 1024)		//单位换算,如果返回的字节数大于1024字节,换算成KB
        ui->txtsizeE->setText(QString::number(size/1024)+"KB");
    else ui->txtsizeE->setText(QString::number(size)+"字节");
    ui->txtnameE->setText(info.fileName());				//显示文件名
    QDateTime created = info.created();					//定义一个时间对象
    ui->createtimeE->setText(created.toString("yyyy-MM-dd hh:mm:ss"));修改时间显示格式
    file.open(QIODevice::ReadOnly);						//文件以只读形式打开
    QByteArray array = file.readAll();					//读取文件所有内容
    ui->textEdit->setText(array);						//显示在多行文字编辑框中
}

3、写入文件操作

void FileOpen::on_saveButton_clicked()
{
    QString v = QFileDialog::getSaveFileName(this,"保存文件","/","TXT(*.txt)");	//弹出保存文件对话框,选择路径,命名
    QFile file(v);
    file.setFileName(v);
    file.open(QIODevice::WriteOnly);				//文件以只写方式打开
    QString str = ui->textEdit->toPlainText();		//将文本编辑框中的内容送给str
    file.write(str.toUtf8());						//将内容转化成UTF-8格式,并写入文件中
}

添加新的线程

.h文件

#include <QThread>   //先添加线程的头文件

class SimpleThreadOne : public QThread     //再添加线程的类, 
{                                  //注意这是另一个类不是widget的了
public:                            //需要实例化 全局变量
    SimpleThreadOne();
    void run();
    void setwidgethandle(); //这是自己定义的函数用来进行线程要做的工作
    Widget* pwidget;//定义一个指针变量
static Widget* myWidget; //定义静态变量 
};

.cpp文件

Widget* Widget::myWidget = NULL;//定义全局指针变量初始化为空最上面定义
//20210524
SimpleThreadOne::SimpleThreadOne()
{

}
void SimpleThreadOne::run()   //修改run函数,用来进行线程要做的工作
{
	while(true)
	{
		qDebug()<<"SimpleThreadOne run!";
		//香农采样定理卷线电机是500ms采样一次   //延时250ms采样一次
		msleep(250);          
		setwidgethandle();       //调用widget发参数的句柄函数
	}
void SimpleThreadOne::setwidgethandle()
{
//在新线程的类里面获取主窗口类的函数的返回值  它返回的是卷线电机的值
	int Xposition=Widget::myWidget->serialPort_readyRead();   
	qDebug()<<"Xposition!"<<Xposition;
	while(Xposition==500)   //X的自动截图的距离 后期定好距离改这里
	{
	Widget::myWidget->Capture();
	
	};
	qDebug()<<"Xposition!"<<Xposition;
}
//20210526

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qingshan_z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值