首页 > 解决方案 > 尝试使用 Qt 打开文件对话框

问题描述

我正在尝试使用 Qt 编写一个简单的 C++ 代码来获取文件夹的路径。

我从这个答案中得到了代码,并对其进行了一些调整以适合我想要的。我的问题是它标记了我的“this”声明,说我的类与“QWidget *”参数类型不兼容。

#include <iostream>
#include <qt5/QtWidgets/qfiledialog.h>

using namespace std;

class TCC {
public:
    string openFile();
};

string TCC::openFile()
{
    QFileDialog::getOpenFileName(this, tr("Open Document"), QDir::currentPath(), tr("Document files (*.doc *.rtf);;All files (*.*)"), 0, QFileDialog::DontUseNativeDialog);

    QString filename = QFileDialog::getOpenFileName(
        this,
        tr("Open Document"),
        QDir::currentPath(),
        tr("Document files (*.doc *.rtf);;All files (*.*)"));
    if (!filename.isNull())
    {
        qDebug(filename.toUtf8());
    }
    return filename.toUtf8().constData();
}

int main()
{
    TCC tcc;
    cout << tcc.openFile();
}

标签: c++qtvisual-c++

解决方案


您的代码中有几个错误:

  1. QFileDialog需要 aQWidget或 nullptr 作为第一个参数。
  2. tr()是一个 QObject 方法,因为没有,所以必须使用QObject::tr().
  3. 要转换QStringstd::string您必须使用该toStdString()方法。
  4. Any QWidget(like QFileDialog) 要求 aQApplication之前已创建。
#include <QApplication>
#include <QFileDialog>

#include <iostream>

class TCC {
public:
    std::string openFile();
};

std::string TCC::openFile()
{
    QString filename = QFileDialog::getOpenFileName(
                nullptr,
                QObject::tr("Open Document"),
                QDir::currentPath(),
                QObject::tr("Document files (*.doc *.rtf);;All files (*.*)"));
    return filename.toStdString();
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    TCC tcc;
    std::cout << tcc.openFile()<< std::endl;

    return EXIT_SUCCESS;
}

推荐阅读