QT编程过程中遇到的问题

QT编程过程中遇到的问题

QT编程过程中遇到的问题

(一)QT卡死(二)mingw转msvc编码问题(三)内存泄漏问题1. vld检查内存泄漏问题2. QTextEdit造成内存泄漏

(四)文件路径问题(5)快速生成打包程序6 配置文件显示中文7 peerAddress()问题8 QTextEdit不同行不同颜色9 QT编译程序,程序异常结束10 判断空指针11 Ubuntu20.04配置静态IP12 QString转QByteArray问题13 mingw编译器下载14 double类型的精确15 switch16 鼠标样式(last)奇怪问题1. win7打不开QT Creator,提示缺少msvc120.dll

(end)后面会更新

(一)QT卡死

1.有可能是安装了有道翻译,卸载有道翻译

(二)mingw转msvc编码问题

1.在pro文件中加入

msvc {

QMAKE_CFLAGS += /utf-8

QMAKE_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()<

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()<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";

else

qDebug()<<"view null";

if(vew == nullptr)

qDebug()<<"dd view null";

else

qDebug()<<"dd view not null";

if( nullptr== vew)

qDebug()<<"dde view null";

else

qDebug()<<"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";

else

qDebug()<<"view null";

if(vew == nullptr)

qDebug()<<"dd view null";

else

qDebug()<<"dd view not null";

if( nullptr== vew)

qDebug()<<"dde view null";

else

qDebug()<<"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";

else

qDebug()<<"view null";

if(vew == nullptr)

qDebug()<<"dd view null";

else

qDebug()<<"dd view not null";

if( nullptr== vew)

qDebug()<<"dde view null";

else

qDebug()<<"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: no

addresses: [192.168.10.122/24]

optional: true

gateway4: 192.168.10.1

nameservers:

addresses: [223.5.5.5,223.6.6.6]

version: 2

renderer: NetworkManager

12 QString转QByteArray问题

QString中有中文字符串时,转换成UTF8保存在QByteAray中时,字节会变宽

QString str = "你";

QByteArray arr = str.toUtf8();

//str.length = 1 arr.length = 3

qDebug()<<"str.length = "<

13 mingw编译器下载

https://sourceforge.net/projects/mingw-w64/

-》file-》Toolchains targetting Win32(64位点击64)-》 Personal Builds-》mingw-builds-》找到对应版本

14 double类型的精确

表达式中混合使用整数和浮点数时,整数会自动提升为浮点数,以匹配精度。

int aa = 3, bb = 10;

double dd = static_cast(bb) / aa;

qDebug()<<"dd = "<

double值的精确

int aa = 3, bb = 10;

double dd = static_cast(bb) / aa;

qDebug()<<"dd = "<

QString ddStr = QString::number(dd,'f',2);

dd=ddStr.toDouble();

qDebug()<<"dd = "<

15 switch

switch 语句不接受 QString 或任何其他字符串类型作为判断条件在case定义变量时,需要使用花括号括起来

16 鼠标样式

enum CursorShape {

ArrowCursor,

UpArrowCursor,

CrossCursor,

WaitCursor,

IBeamCursor,

SizeVerCursor,

SizeHorCursor,

SizeBDiagCursor,

SizeFDiagCursor,

SizeAllCursor,

BlankCursor,

SplitVCursor,

SplitHCursor,

PointingHandCursor,

ForbiddenCursor,

WhatsThisCursor,

BusyCursor,

OpenHandCursor,

ClosedHandCursor,

DragCopyCursor,

DragMoveCursor,

DragLinkCursor,

LastCursor = DragLinkCursor,

BitmapCursor = 24,

CustomCursor = 25

};

ArrowCursor: 标准箭头光标。

UpArrowCursor: 向上指的箭头。

CrossCursor: 十字形光标,常用于精确标记。

WaitCursor: 等待/沙漏光标,表示系统忙。

IBeamCursor: 文本编辑中的I形光标,指示可以输入文字。

SizeVerCursor: 垂直调整大小的光标(上下箭头)。

SizeHorCursor: 水平调整大小的光标(左右箭头)。

SizeBDiagCursor: 右斜线形状,用于对角线(从左上到右下)调整大小。

SizeFDiagCursor: 左斜线形状,用于对角线(从右上到左下)调整大小。

SizeAllCursor: 四向箭头,表示可以向所有方向调整大小。

BlankCursor: 一个不可见的光标。

SplitVCursor: 垂直分割光标,用于调整两个垂直分隔面板的大小。

SplitHCursor: 水平分割光标,用于调整两个水平分隔面板的大小。

PointingHandCursor: 手形光标,通常用于指示可点击的链接。

ForbiddenCursor: 禁止/不允许符号。

WhatsThisCursor: “这是什么”光标,通常是一个带有问号的光标。

BusyCursor: 忙碌光标,通常是一个旋转的圆圈。

OpenHandCursor: 打开的手掌,通常用于拖拽。

ClosedHandCursor: 握着的手掌,通常在拖拽过程中使用。

DragCopyCursor: 拖动复制的光标。

DragMoveCursor: 拖动移动的光标。

DragLinkCursor: 拖动创建链接的光标。

LastCursor = DragLinkCursor: 最后一个光标,等同于DragLinkCursor。

BitmapCursor: 位图光标,允许自定义图像。

CustomCursor: 自定义光标。

(last)奇怪问题

1. win7打不开QT Creator,提示缺少msvc120.dll

运行安装D:\qt_install\vcredist下的vcredist_msvc2013_x86.exe 或者下载vcredist_msvc2013_x86.exe

(end)后面会更新

相关内容

《英雄联盟》S14最佳五大打野
365betasia

《英雄联盟》S14最佳五大打野

⌚ 08-10 👁️‍🗨️ 9883
“七普”
365bet外围

“七普”

⌚ 07-30 👁️‍🗨️ 2410
金属钨的光辉秘史
365bet外围

金属钨的光辉秘史

⌚ 08-21 👁️‍🗨️ 4302

友情链接