**
2020
目录
- 信号和槽 03_SignalAndSlot2
- Qt5 中文乱码问题
- 出现LNK2019 qt 未找到文件:mainwidget.obj 解决方法
- Qt打开项目提示no valid settings file could be found qt
- **添加静态库和动态库**
- 添加SDK头文件
- 项目刚运行时异常中断
- 更改编译器后,程序中文字符报错显示,包含换行符等字符显示错误
- bool二值类型
- QT如何更改编译器
- 项目今天打开后,无法编辑 编译类型出错
- QWidget转HWND
- HWND转QWidget
- int转化为QString
- 获取当前时间
- SPrintf函数
- **返回值问题**
- 更新第二个窗口(由于按下按钮截图,要显示新截的图,每次都要更新)
- 字符串截取
- 多选框
- 存TextEdit文本编辑框的内容存成QString
- 由于找不到Qtxxxx.dll,无法继续执行代码
- 打包:release版本
- Release版本自动优化导致延时循环被优化
- 带有返回值的函数,必须return!!!!
- 添加按钮,用默认浏览器打开网页
- QFile读写文件
- 添加新的线程
信号和槽 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文件夹中的对应内容。
更改编译器后,程序中文字符报错显示,包含换行符等字符显示错误
改两个地方:
- 改编码为UTF-8:编辑—Select Encoding—UTF-8—按编码保存
- 工具—选项—文本—行为—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);
//由于年月日太长,分成两个参数,传参两次。
返回值问题
- 函数数据类型和返回值类型保持一致。(为什么要给截图定义返回值?因为函数运行结束后内部数据销毁,所用到的路径信息无法传到另一个窗口调用)
- 为什么返回值要用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