【问题标题】:Trying to open file dialog with Qt尝试使用 Qt 打开文件对话框
【发布时间】:2021-10-28 06:33:39
【问题描述】:

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

我从this 答案中获得了代码,并对其进行了一些调整以适合我想要的。我的问题是它标记了我的“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();
}

【问题讨论】:

  • 我相信您传递给getOpenFIleName 的指针应该是派生自QWidget 的类类型
  • 将指向您的一个 QWidgets 的指针作为第一个参数传递将帮助 Qt 知道要在哪个监视器上打开对话框(它将打开到与该小部件相同的监视器上)
  • 对话框也会继承父控件的样式表。

标签: c++ qt visual-c++


【解决方案1】:

您的代码中有几个错误:

  1. QFileDialog 需要 QWidget 或 nullptr 作为第一个参数。
  2. tr()是一个QObject方法,既然没有,就必须使用QObject::tr()
  3. 要将QString 转换为std::string,您必须使用toStdString() 方法。
  4. 任何QWidget(如QFileDialog)都需要之前已创建QApplication
#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;
}

【讨论】:

  • 我明白你在说什么!我设法让它工作并将其更改为仅接受文件夹以获取文件夹路径。谢谢!
  • 只有在需要翻译时才使用QObject::tr。据我从 OP 代码中可以理解,情况似乎并非如此。如果是这样,可以简化传递原始字符串(QString 的隐式构造)。
  • 另外,请注意,'QString::toStdString` 返回一个 UTF-8 字符串,所以如果您期待任何其他页面代码,请小心。
猜你喜欢
  • 1970-01-01
  • 2014-01-14
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 2012-04-25
  • 2010-12-11
相关资源
最近更新 更多