记录使用 Qt5.x 遇到的错误

记录使用 Qt5.x 遇到的错误

继承于QWidget的外部样式设置无效

在继承QWidget时,我们在设置样式表时,不会有效果。原因在于 QWidget的paintEvent函数未实现。

解决方法:

void BaseWidget::paintEvent(QPaintEvent *event)
{
        QStylePainter painter(this);
        //用style画背景 (会使用setstylesheet中的内容)
        QStyleOption opt;
        opt.initFrom(this);
        opt.rect = rect();
        painter.drawPrimitive(QStyle::PE_Widget, opt);
        QWidget::paintEvent(event);
}

compiler is out of heap space

Qt5.7+vs2013 在windows平台下qrc_images.cpp(源文件images.qrc)的大小超过30M就报fatal error C1060: compiler is out of heap space错误。
解决方法:把一个qrc文件拆成多个qrc解决的,最终qrc_images.cpp 22.2M通过编译
Qt5.7 MinGW编译器则没有这个限制。

run 中 new 要在线程中释放

环境qt5.x MinGW ExcelThread线程 pExcelEngine一个读写Excel的类class ExcelEngine : public QObject 其中 pExcel = new QAxObject(“Excel.Application”);
如果把pExcelEngine = new ExcelEngine;放入init函数中则会报错(错误信息忘记记录了。。。)
,放到run()中则不会。 ----应该是该类不支持跨线程操作

bool ExcelThread::init(int quetypeid,
                       const QString xls)
{
    bool isok = true;
    queTypeId = quetypeid;
    xlsName = xls;
    return isok;
}
void ExcelThread::run()
{
    int ret = -1;
    if(pExcelEngine){
        delete pExcelEngine;
    }
    pExcelEngine = new ExcelEngine;
connect(pExcelEngine,SIGNAL(sendExcelData(QuestionData*,int)),
            this,SLOT(receiveExcelData(QuestionData*,int)));
    pExcelEngine->setSXlsFile(xlsName);
    pExcelEngine->setExcelType(queTypeId);
    int sheet = 1;
    bool isopen = pExcelEngine->Open(sheet,false);
......
}

成员变量在线程run()运行无法赋值,必须声明为static变量
.h 文件中 static QString _v;
.cpp文件构造函数上方QString 类名::_v = “”;

枚举,字符串 互转

这里写图片描述

Qt 共享库和Plugin不容易查的错误

这里写图片描述
–Plugin:找不到指定模块。1.路径错误 2.路径正确的情况下是否使用第三方库LIBS +=-L$$PWD/ -lxx
表示第三库的dll没有放入指定路径
–上图找不到BaseWidget.h 查看最后加载哪个.cpp文件图片:mainwindow.cpp
再在pro文件中加入缺失BaseClass/BaseClass.pri

下面的错误头文件明明已经加了,还提示找不到,查看提示是蓝色框框中的文件头文件没加pri(多项目编程最常见的错误)需要把当前的头文件路径加到蓝色框文件项目中。
这里写图片描述

[Qt Creator的问题]Cannot retrieve debugging output

,两个IDE(同一qt版本打开2次及以上)同时打开,后打开的会出现这个情况
解决方案:
只打开一个IDE。(一个qt版本只打开一次)

setMouseGrabEnabled: Not setting mouse grab for invisible window QWidgetWindow/‘QMenuClassWindow’


setMouseGrabEnabled: Not setting mouse grab for invisible window QWidgetWindow/‘QMenuClassWindow’
QMenu类中没有QAction时会报

定时器.start()后内存无限涨再释放再涨


原因:一个定时器周期内函数执行时间超过了定时器则.start()后无限涨内存。
解决方案:减少函数执行周期,提前new要使用的对象,优化执行时间.

error: undefined reference to `__imp_select’

error: undefined reference to `__WSAFDIsSet’

解决:pro文件中加入: LIBS += -lws2_32 【类似的错误百度缺少的库】

Qt 多子项目套子项目时

这里写图片描述
解决:缩短项目文件及文件夹名称【编译路径太长了】

QT g++: error: unrecognized command line option ‘-R’

qt:错误:无法识别的命令行选项“r”
解决:查找pro,发现应该是【LIBS += -lRo模块名】错写成【-Ro模块名】(可能是我的模块的首字母是R才报-R的)

uint”: 不明确的符号

出现这种错误是因为引用的第三方库也对uint进行了声明与qt中的uint声明引起编译器错误(编译器不知道编译时用哪个声明编译)
//以谷歌的protobuf引起这个错误为例
解决方式:查找using namespace google::protobuf;注释掉
使用下列方式指定
google::protobuf::RepeatedPtrField<Message_AdvancedCurve>

WebEngineContext used before QtWebEngine::initialize() or OpenGL context creation failed


出现情况:vs2015+Qt5.9.4 使用QWebEngineView类,选择32bit编译时正常, 选择64bit编译出现上述错误,并崩溃
解决方法:在new QWebEngineView前 加上QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);

挂了3天win7系统物理内存上涨,关闭软件内存依然没回收

解决方法:CloseHandle(HANDLE); //共享内存分配后不会自动回收

LNK4042:对象被多次指定;已忽略多余的指定

解决方法:查看报错的xxx.obj,查找xxx.cpp是否被多次加入.pro/.pri文件中

Qt 会把.ui文件加入的快捷键作为翻译源

解决方法:中英文翻译,在.ui文件设置某个按钮的快捷键,出现在了.ts中。。。一定注意

网友: webengine退出时偶有崩溃的问题

解决办法:
继承QWebEnginePage的构造函数中需要传入QWebEngineProfile,不传就偶尔有问题。

文件修改时间在未来 xxx 秒后

解决方法:sudo find 文件目录/* -exec touch {} +

Syntax error: word unexpected (expecting “)”)

解决方法:kits套件里的 gcc g++的套件被篡改了

enum {E_A,E_B}; 因为枚举大括号没有加分号;导致的错误

在这里插入图片描述
解决:enum {

};

因为容器没有互锁访问导致崩溃的bug

QGraphicsItem 中
遇到崩溃,断点调到此处 QList()<<QPoint()
发现内存什么的都问题, 发现是使用容器, shape(),boundRect(),paintevent()中都使用没有互斥导致的崩溃

QSqlDatabase 类无法断开

解决方法:注意里面的 {}大括号,QSqlDatabase dbTmp与 QSqlDatabase::removeDatabase(_connectionName)不能在同一作用域,否则无法删除连接

SqlClass::~SqlClass()
{
    //    //QSqlDatabasePrivate::removeDatabase: connection 'XXX' is still in use, all queries will cease to work
    if(QSqlDatabase::contains(_connectionName)){
        {
            QSqlDatabase  dbTmp = QSqlDatabase::database(_connectionName);
            if(dbTmp.isValid()){
                QSqlDatabase *db = &dbTmp;
                if(db->isOpen())
                    db->close();
                SCDebug<<"removeDatabase:"<<_connectionName;
            }
        }
        QSqlDatabase::removeDatabase(_connectionName);
    }
}

无法解析的外部符号 "public: static struct QMetaObject

MSVC编译器
1.如果这个错误是发生在lib库中的类,查看有无加 Q_OBJECT,如果加了,Rebuild这个模块,再运行

2.如果错误还未消除,查看调用这个类的模块是否在.pro中重复定义了lib中的导出宏,经实验如果lib库中的导出宏在别的模块中重复声明会导致它默认未导出

Warning: Setting a new default format with a different version or profile after the global shared context is created may cause issues with context sharing.

解决:检查 .exe 路径下的 Qt.dll 产品版本不一致

Warning: The name ‘layoutWidget’ (QWidget) is already in use, defaulting to ‘layoutWidget1’

解决: 用文本打开 .ui 文件, 搜索 “layoutWidget” 有重复的手动改成 “layoutWidget1” 即可

Call to virtual method ‘xx::xx’ during construction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]

描述:在构造期间调用虚拟方法’子类::虚函数’绕过虚拟调度[clang-analyzer-optin.cplusplus.VirtualCall]
解决方法: 需要在子类构造中写成:子类::虚函数
注意:基类的构造和析构中不能写虚函数
检查便准:https://clang.llvm.org/docs/analyzer/checkers.html#optin-cplusplus-virtualcall 1.1.5.2. optin.cplusplus.VirtualCall (C++)

LINK : fatal error LNK1158: cannot run ‘rc.exe’

把 vs2015 中的 rcdll.dll 和 rc.exe 拷贝到 H:\Qt\Qt5.12.12\5.12.12\msvc2015_64\bin 即可

QGraphicScene 移动 QGraphicItems 并删除会崩溃到 QGraphicsSceneFindItemBspTreeVisitor::visit

解决方法: QGraphicScene->setItemIndexMethod(QGraphicsScene::ItemIndexMethod::NoIndex);

QtPrivate::warnIfContainerIsNotShared”: 未找到匹配的重载函数

在这里插入图片描述
解决方式: 鼠标右击复制这个错误

D:\Qt\6.7.2\6.7.2\msvc2019_64\include\QtCore\qforeach.h:51: error: C2672: “QtPrivate::warnIfContainerIsNotShared”: 未找到匹配的重载函数
D:\Qt\6.7.2\6.7.2\msvc2019_64\include\QtCore/qforeach.h(51): error C2672: “QtPrivate::warnIfContainerIsNotShared”: 未找到匹配的重载函数
D:\coding\r3_q6\v3\Libs\CLibs\MapEditor\MapGraphics\MapCore\src\RoOpencv3xThread.cpp(119): note: 查看对正在编译的函数 模板 实例化“QtPrivate::QForeachContainer<std::vector<RO_R3Map::MapPoint,std::allocator<RO_R3Map::MapPoint>>> QtPrivate::qMakeForeachContainer<std::vector<RO_R3Map::MapPoint,std::allocator<RO_R3Map::MapPoint>>&>(T)”的引用
        with
        [
            T=std::vector<RO_R3Map::MapPoint,std::allocator<RO_R3Map::MapPoint>> &
        ]

这种错误一般都是 auto 导致的, 但这个是 foreach 的问题,使用 for
在这里插入图片描述

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Qt6.x是一种跨平台的C++应用程序开发框架,它可以帮助开发者快速构建高性能的图形化界面和功能丰富的应用程序。要想从入门到精通Qt6.x,以下是一些步骤和建议。 首先,你需要熟悉C++编程语言。Qt是用C++编写的,因此对C++的基本语法和面向对象编程的概念有一定的了解是必要的。 接下来,你可以开始学习Qt的基本知识。可以阅读Qt的官方文档,了解Qt的概念、架构和核心模块。同时,可以通过阅读书籍或参加在线教程来学习Qt的基本功能和API的使用。 熟悉Qt的基本知识后,你可以开始实践一些简单的项目。选择一些小型的应用程序,如窗口应用程序或基于Qt的控制台应用程序。通过实践,你可以熟悉Qt的开发环境、工具和调试技术,并逐渐掌握Qt的开发流程。 在实践过程中,你可以深入研究Qt的各种模块和功能。Qt有丰富的模块,如图形绘制、多媒体处理、网络通信和数据库访问等。通过深入学习这些模块,你可以扩展自己的Qt技能并应用于更复杂的项目中。 此外,参与Qt的社区和论坛也是提高自己的Qt技能的好方式。在这里,你可以和其他开发者交流经验、解决问题,并了解最新的Qt开发动态。 最后,不断实践、学习和挑战自己是成为Qt专家的关键。通过不断地开发、优化和改进项目,你可以提高自己的编码技巧和解决问题的能力,逐渐达到精通Qt的水平。 总之,要想从入门到精通Qt6.x,你需要熟悉C++编程语言、学习Qt的基本知识、实践项目、深入研究各种功能模块,并积极参与Qt社区。通过坚持不懈的努力,你将能够掌握Qt6.x并成为一名专业的Qt开发者。 ### 回答2: Qt是一款功能强大的跨平台开发框架,能够方便地创建各种类型的应用程序。Qt 6.x是Qt框架的最新版本,它有许多新增功能和改进,下面我将简要介绍从入门到精通Qt 6.x的几个关键步骤。 首先,对于初学者来说,了解Qt的基本概念和基本语法是非常重要的。你可以通过阅读官方文档、教程和书籍来学习Qt的基础知识,如Qt的信号和槽机制、Qt的界面布局、Qt的核心类等等。 其次,实践是提高Qt编程能力的关键。尝试编写一些简单的Qt应用程序,例如一个简单的窗口应用程序、一个简单的表单应用程序等等。通过实践,你可以更好地理解Qt的工作原理,并且熟悉Qt提供的各种类和函数。 第三,了解Qt的模块和扩展是非常重要的。Qt提供了许多有用的模块和扩展,如Qt Widgets、Qt Quick、Qt Network、Qt Multimedia等等。对于不同类型的应用程序,选择适当的模块和扩展来开发是非常关键的。学习如何使用这些模块和扩展,可以提高你的Qt编程技巧。 最后,阅读和参与Qt的社区也是提升Qt编程能力的一种方法。在Qt的官方论坛或者Qt的开源社区中,你可以与其他Qt开发者交流经验和技巧,了解最新的Qt开发动态,还可以发现一些有用的代码和工具。 总的来说,要从入门到精通Qt 6.x,你需要掌握Qt的基础知识,进行实践,了解Qt的模块和扩展,并积极参与Qt社区。希望这些简要的步骤能够帮助你在Qt编程领域取得更大的进步。 ### 回答3: Qt是一款强大的跨平台开发框架,用于创建高性能和可扩展的应用程序。Qt 6.x是Qt的最新版本,具有许多新功能和改进。要从入门到精通Qt 6.x,可以按照以下步骤进行学习: 1. 学习Qt基础知识:了解Qt的概念、架构和基本组件。学习如何使用Qt的核心类库和工具。 2. 掌握Qt的GUI编程:学习Qt的GUI编程模型和常用的控件。深入了解Qt的信号与槽机制,能够编写响应用户交互的界面。 3. 学习Qt的绘图和动画:了解Qt的绘图和动画框架。学习如何绘制图形、绘制自定义控件和实现动画效果。 4. 学习Qt的数据库编程:了解Qt的数据库模块,学习如何使用SQL语言进行数据库操作。学习如何使用数据库模型和视图来处理大量数据。 5. 深入研究Qt的网络编程:学习Qt的网络模块,了解如何进行网络通信和数据传输。学习如何使用Qt的套接字类和网络协议。 6. 学习Qt的多线程编程:了解Qt的多线程编程模型,学习如何使用Qt的线程类和同步机制。学习如何编写并发程序和处理大量数据。 7. 学习Qt的高级主题:深入研究Qt的高级主题,如国际化、定制控件、插件开发和集成第三方库。学习如何优化Qt应用程序的性能和可靠性。 8. 实践项目开发:通过开发实际项目来巩固所学知识。选择一个感兴趣的项目,并运用所学技能来完成它。 通过系统地学习和练习,逐步提升自己的Qt技能,就能够从入门到精通Qt 6.x。同时,参考官方文档和在线教程,参与Qt社区讨论,与其他开发者交流,可以加快学习的进度,并获取更多实践经验和技巧。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值