使用Qt打开文件对话框时出现this与QWidget*参数类型不兼容报错如何解决
错误原因
QFileDialog::getOpenFileName第一个入参要求是QWidget*类型的父窗口指针,你自定义的TCC类没有继承QWidget,this指针为TCC*类型,类型不匹配直接触发编译报错。- 除此之外代码还存在几个Qt程序基础问题:
- Qt Widgets 程序必须先初始化
QApplication实例才能使用UI组件,当前main函数未初始化Qt应用,即便解决this参数问题也无法正常运行 - 你的需求是获取文件夹路径,应该调用
QFileDialog::getExistingDirectory接口,而非获取文件路径的getOpenFileName tr是QObject类的成员方法,非QObject子类无法直接调用,无国际化需求可直接用QStringLiteral包裹字符串
- Qt Widgets 程序必须先初始化
修复后完整代码
#include <iostream> #include <QApplication> #include <QFileDialog> #include <QDebug> using namespace std; class TCC { public: string openFolder(); }; string TCC::openFolder() { // 第一个参数传nullptr即可,无父窗口时属于合法用法 QString folderPath = QFileDialog::getExistingDirectory( nullptr, QStringLiteral("选择文件夹"), QDir::currentPath(), QFileDialog::DontUseNativeDialog ); if (!folderPath.isNull()) { qDebug() << folderPath; } return folderPath.toUtf8().constData(); } int main(int argc, char *argv[]) { // 必须先初始化QApplication才能使用Qt UI组件 QApplication a(argc, argv); TCC tcc; cout << tcc.openFolder(); return 0; }
关键修改说明
- 将对话框接口第一个参数的
this替换为nullptr,无父窗口时传空指针是Qt官方认可的标准用法 - 新增
QApplication初始化逻辑,符合Qt Widgets程序的运行要求 - 把获取文件的接口替换为
getExistingDirectory,匹配获取文件夹路径的需求 - 替换
tr为QStringLiteral,避免非QObject子类无法调用tr的问题 - 修正头文件引入规则,适配标准Qt项目的头文件写法
内容的提问来源于stack exchange,提问作者Vinícius Inacio Breda
相关产品推荐
相关产品推荐

