Qt在编程过程所遇到的问题------》记录篇
1.中文乱码问题;
在用到中文的头文件后加
#pragma execution_character_set("utf-8")
2.bmp文件打不开时值需要用把QImage转QPixmap在save就好了。
QPixmap pix = QPixmap::fromImage(m_SaveImg);
3.QString.sprintf()不支持qstring转到%s,需要用QByteArray去转换然后取data()
例:
QByteArray tem = strFilePath.toLatin1();
QString strFileName.sprintf("%s/%d-%d-%d-%d-%d-%d-%d.bmp",tem.data(),
sysTime.wYear,
sysTime.wMonth,
sysTime.wDay,
sysTime.wHour,
sysTime.wMinute,
sysTime.wSecond,
sysTime.wMilliseconds);
4.在mfc工程读取ini文件,遇到读取string程序会异常中断,并报出一下示例错误_acrt_first_block = =header
解决办法:(项目属性设置)
1、在共享 DLL 中使用 MFC(运行时库肯定要用动态的运行时库)
Debug配置 --> Multi-threaded Debug DLL(/MDd)
Release配置 --> Multi-threaded DLL(/MD)
2、在静态库中使用 MFC(运行时库肯定要用静态的运行时库)
Debug配置 --> Multi-threaded Debug(/MTd)
Release配置 --> Multi-threaded(/MT)
5.QString转换char时中文乱码问题
QString str = "E:\测试\tiaoshi.exe"
char s_char = str.toLatin1();//此功能代替qt4中的toascii ,此方式转换不支持中文
char s_char1 = str.toLocal8Bit();//toLocal8Bit两个是Qbytearray类型,转换此类型支持中文
6.遇到winapi报错 时
需要在调用的地方加#include <afxwin.h>
7.Qt莫名的加载不上任何图片,但是只能加载png格式的图片
如果代码没有写错,但是还是加载不上,就要看运行目录里有没有plugins目录下的相应的库,因为加载png是不需要这些库,而加载jpg等格式的文件是需要这些库文件支持的,所以要去Qt安装环境下,将plugins文件夹复制粘贴至运行目录下,即可,或者配置系统环境变量,-----------
8.This application failed to start because no Qt platform plugin
could be initialized Reinstalling the application may fix this
problem.
报错-》》》》》》可能是
这些库与版本不对应
9.关于StyleSheet 和 QPaltte 的冲突的问题
程序在初始化时调用了qss文件初始化程序主题,这个主题设置了Qeditline的样式,然后使用
QPalette pal = QApplication::palette();
pal = ui.edit->palette();
pal.setBrush(QPalette::Text, QBrush(color));
ui.edit->setPalette(pal);
这种画刷工具事使用没有效果,目前的处理方案是使用动态的StyleSheet来刷新显示
QString StyleQss;
StyleQss = QString("background-color: rgb(255, 255, 255); color:rgb(%1, %2, %3);").arg(color.red()).arg(color.green()).arg(color.blue());
ui.edit->setStyleSheet(StyleQss);
目前没有找到其他解决办法,望指点。。。。
10.在使用QString转换到char 或者const char 的时候,务必记得分两步来完成
QString text = "ceshi";
//下面这样转换很可能会有问题
char *data = text.toUtf8().data();
//分两步转换肯定不会有问题
QByteArray buffer = text.toUtf8();
char *data = buffer.data();
const char *data = buffer.constData();
11.报错“Cannot queue arguments of type ‘s_PLCPara’” 在发射信号的时候
1》修改Connect,加一个属性Qt::directConnection.
connect(thread1, SIGNAL(freshImg(const cv::Mat &)), this, SLOT(show_img(const cv::Mat &)),Qt::DirectConnection);
这种方式在不跨线程可以使用,如果在多线程状态下,多线程无效。
2》qRegisterMetaType<s_PLCPara>(“s_PLCPara”); 将自定义结构体进行注册,
12.彩色相机显示图像颜色不对 红色显示蓝色
1.一般都是颜色通道不对应,就是地址回调是BGR,生成的Qimage需要的事RGB 这时候就需要用image.rgbSwapped()进行转换;
image.rgbSwapped()转换速度比较慢
由 RGB 格式转换成 BGR 格式QImage::rgbSwapped()
返回一个QImage,其中所有像素的红色和蓝色组件的值被交换,有效地将RGB图像转换为BGR图像。QImage image(fileName);
QImage bgr = image.rgbSwapped();
13.QImage.saved()或者opencv :: imwrite()问题可能性
1.可能就是在创建文件夹失败,我用的是mkdir
补充:
mkdir:上层目录不存在时,创建会失败。比如创建“c:\test est”,如果test不存在,那test也创建不了。目录已经存在时会返回false。mkpath:上层目录不存在也没关系,自动一起创建。目录已经存在时会返回true。
13.加入opencv后 报-》“cv::max”: 6 个重载中没有一个可以转换所有参数类型
1正确顺序
将想调用的放在后面来进行包含;
14,Qt4升级Qt5 之 winEventFilter 无效![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/45e989aade8d8c1742ffb97550a6dda3.png)
qt类里没有eventFilter
-》》》》
头文件
protected:
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override;
cpp
重写nativeEventFilter
注册
qApp->installNativeEventFilter(m_uDisk);
15 LNK2001 无法解析的外部符号 “public: static struct QMetaObject const
1.链接库完好 moc 文件已经生成
那么 -》》自己封装dll给的头文件中有Q_OBJECT宏,同时此类的父类也有Q_OBJECT宏,就会报错,把父类中的Q_OBJECT宏删掉即可。
16 Windows 下使用 CMake 时Qt 5.12 应用程序在 Windows 总是打开一个控制台窗
需要将 WIN32 添加到您的 add_executable() 语句中:
add_executable(GuiApplication WIN32 src/main.cpp)