QT编程过程中遇到的问题
- (一)QT卡死
- (二)mingw转msvc编码问题
- (三)内存泄漏问题
- 1. vld检查内存泄漏问题
- 2. QTextEdit造成内存泄漏
- (四)文件路径问题
- (5)快速生成打包程序
- 6 配置文件显示中文
- 7 peerAddress()问题
- 8 QTextEdit不同行不同颜色
- 9 QT编译程序,程序异常结束
- 10 判断空指针
- 11 Ubuntu20.04配置静态IP
- 12 QString转QByteArray问题
- (last)奇怪问题
- 1. win7打不开QT Creator,提示缺少msvc120.dll
- (end)后面会更新
(一)QT卡死
1.有可能是安装了有道翻译,卸载有道翻译
(二)mingw转msvc编码问题
1.在pro文件中加入
msvc {QMAKE_CFLAGS += /utf-8QMAKE_CXXFLAGS += /utf-8
}
或者在头文件中加入:
#pragma execution_character_set("utf-8")
msvc 是一种编译器,这段代码是在QT工程文件(.pro)中使用的QMake语法,用于将编译器的选项设置为使用UTF-8字符集。
具体而言,QMAKE_CFLAGS 和 QMAKE_CXXFLAGS 分别表示C语言编译器和C++编译器的编译选项。/utf-8
是MSVC编译器的一个编译选项,表示将程序的执行字符集设置为UTF-8。在这段代码中,将这个选项添加到了工程文件中,以确保在使用MSVC编译器编译QT程序时,使用的是UTF-8字符集。需要注意的是,这段代码只在使用MSVC编译器时才会生效,在其他编译器下可能需要使用不同的编译选项。另外,如果使用的编译器已经设置为使用UTF-8字符集,则这段代码可能不是必需的。
#pragma execution_character_set(“utf-8”) 是一条编译指示,用于告诉编译器将程序的执行字符集设置为UTF-8。执行字符集指的是程序在运行时所使用的字符集,而不是源代码文件的字符集。
在某些情况下,源代码文件使用的字符集和程序的执行字符集可能不一致,例如在Windows操作系统下,程序默认使用的是本地的ANSI字符集,而不是UTF-8字符集。如果源代码文件中包含了中文字符或其他特殊字符,而执行字符集又不支持这些字符,则可能会出现乱码或其他异常情况。
通过在源代码文件中添加 #pragma execution_character_set(“utf-8”)
这条编译指示,可以确保程序在执行时使用UTF-8字符集,从而避免乱码或其他问题。需要注意的是,不是所有编译器都支持 #pragma
execution_character_set 这条指示,如果编译器不支持,该指示可能会被忽略。
(三)内存泄漏问题
1. vld检查内存泄漏问题
是在msvc编译器中的debug模式下
2. QTextEdit造成内存泄漏
QTextEdit中内容叠加会造成内存泄漏
for (int i=0;i<10000;i++) {ui->textEdit->append("0123456789");}
如果不对textEdit行数进行控制任由其增长,那么内存也会疯狂增长
改进方法:最大行数设置
//1
ui->textEdit->document()->setMaximumBlockCount(10);//设置10行,超过10行自动清除//2 通过设置一个int类型变量。记录增加的行数,当达到一定的值,就执行clear()
(四)文件路径问题
1 使用相对路径,文件放在工作目录下。
工作目录查看方式:
1.在项目-》构建&运行-》运行-》工作目录中查看
2.qDebug()<<QDir::currentPath();
例如:
QFile file("1.txt");
if(!file.open(QIODevice::ReadOnly))
{qDebug()<<"打开失败";return;
}
2 如果说,1.txt文件在可执行文件的上一层:
QFile file("../2.txt");
if(!file.open(QIODevice::ReadOnly))
{qDebug()<<"打开失败";return;
}
../
表示当前文件的上一级
- 使用在pro文件中DESTDIR可以改变工作目录
所以以后要注意访问的文件的位置,包括,配置文件,数据库,图标等等,一定是相对于工作目录而言
3 如果文件是资源文件,使用:访问:
QFile file(":/res/3.txt");
if(!file.open(QIODevice::ReadOnly))
{qDebug()<<"打开失败";return;
}
(5)快速生成打包程序
将set PATH=D:\qt\5.14.2\msvc2017\bin;%PATH%
这一行自己QT路径;并将文件名改为.cmd
echo off
echo Setting up environment for Qt usage...set PATH=D:\qt\5.14.2\msvc2017\bin;%PATH%echo Remember to call vcvarsall.bat to complete environment setup!for /F "delims=" %%a in ('dir /b/a *.exe') do set FileName=%%a
echo %FileName%
windeployqt %FileName%
pause
6 配置文件显示中文
QSettings setting(configFile,QSettings::IniFormat);
setting.setIniCodec("UTF-8");
7 peerAddress()问题
在使用这个函数时例如:
qDebug()<<tcpSocket->peerAddress();
返回的结果:QHostAddress(“::ffff:192.168.1.106”)
::ffff:说明
这是因为IPv4和IPv6有所不同,IPv6使用128位地址,IPv4使用32位地址。为了兼容IPv4地址,IPv6的地址有时会表示成IPv4的点分十进制格式,但是会在前面添加一个特殊的前缀“::ffff:”。这个前缀在IPv4映射到IPv6的过程中起到标识作用,表示这是一个IPv4地址。所以你得到的peerAddress值中出现了::ffff:前缀,表示这是一个IPv4地址映射到IPv6地址的结果。
获得纯IPv4地址方法:
qDebug() << QHostAddress(tcpSocket->peerAddress().toIPv4Address()).toString();
8 QTextEdit不同行不同颜色
QString currentTime = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");QString content = "";if(type == 0){content = currentTime+" --提示--:"+msg;ui->textEdit->setTextColor(QColor(Qt::darkBlue));}else if(type == 1){content = currentTime+" 收到数据<< "+msg;ui->textEdit->setTextColor(QColor(Qt::red));}else if(type == 2){content = currentTime+" 发送数据>> "+msg;ui->textEdit->setTextColor(QColor(Qt::blue));}ui->textEdit->append(content);
9 QT编译程序,程序异常结束
- 在可执行文件中缺少第三的库或者其他文件
10 判断空指针
int *vew是空指针。
int *vew;if(vew)qDebug()<<"view not null";elseqDebug()<<"view null";if(vew == nullptr)qDebug()<<"dd view null";elseqDebug()<<"dd view not null";if( nullptr== vew)qDebug()<<"dde view null";elseqDebug()<<"dde view not null";结果:
view null
dd view null
dde view null推荐使用第一种方法判断,其他几种可能会受到平台的影响
int *vew = new int;此时vew不是空指针
int *vew = new int;if(vew)qDebug()<<"view not null";elseqDebug()<<"view null";if(vew == nullptr)qDebug()<<"dd view null";elseqDebug()<<"dd view not null";if( nullptr== vew)qDebug()<<"dde view null";elseqDebug()<<"dde view not null";结果:
view not null
dd view not null
dde view not null
delete vew;vew依然不为空。
int *vew = new int;delete vew;if(vew)qDebug()<<"view not null";elseqDebug()<<"view null";if(vew == nullptr)qDebug()<<"dd view null";elseqDebug()<<"dd view not null";if( nullptr== vew)qDebug()<<"dde view null";elseqDebug()<<"dde view not null";
结果:
view not null
dd view not null
dde view not null
在delete后需要将指针指向nullptr,再判断的话就是空。即使delete掉指向nullptr的指针,也不会有问题
11 Ubuntu20.04配置静态IP
#按照配置设置
sudo vim /etc/netplan/01-network-manager-all.yaml
//保存退出后执行
sudo netplan apply
# Let NetworkManager manage all devices on this system
network:ethernets:ens33:dhcp4: noaddresses: [192.168.10.122/24]optional: truegateway4: 192.168.10.1nameservers:addresses: [223.5.5.5,223.6.6.6]version: 2renderer: NetworkManager
12 QString转QByteArray问题
QString中有中文字符串时,转换成UTF8保存在QByteAray中时,字节会变宽
QString str = "你";
QByteArray arr = str.toUtf8();
//str.length = 1 arr.length = 3
qDebug()<<"str.length = "<<str.length()<<"arr.length = "<<arr.length();
(last)奇怪问题
1. win7打不开QT Creator,提示缺少msvc120.dll
运行安装D:\qt_install\vcredist下的vcredist_msvc2013_x86.exe
或者下载vcredist_msvc2013_x86.exe