3

为了练习,我正在尝试使用 QT 库选择一个文件夹并列出该文件夹中 dicom 文件的名称。以下是代码:

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


    QApplication app(argc, argv);
    QString fileName = QFileDialog::getExistingDirectory();


    if (fileName.isEmpty())
    {
        std::cout << "Got an empty file!\n";
    }
    else
    {
        QStringList nameFilter;
        QDir dir(fileName);
        nameFilter << "*.dcm";
        QFileInfoList list = dir.entryInfoList( nameFilter, QDir::Files );
        int numberOfFiles=list.count();

        for(int i=0;i<numberOfFiles;i++)
        {
            QString filena=list[i].fileName();
            string a=filena.toStdString();
            cout<<a<<endl;

        }
    }
   return 0;
}

在这里,我发现该函数toStdString实际上是std::string QString::toStdString () const,给出了堆错误。我知道摆脱这个错误的替代方法是使用toLocal8Bit().constData(),但我很好奇 toStdString 提供的堆错误背后的主要原因是什么。是因为它是const类型,而我的 for 循环每次都试图覆盖 const 变量吗?

4

3 回答 3

2

您的代码看起来不错 - 确保您的 Qt 的 dll 文件是使用您正在使用的相同编译器(以及相同的调试/发布配置)编译的。

要回答您的一些问题:

是因为它是 const 类型而我的 for 循环每次都试图覆盖 const 变量吗?

不,您的 for 循环不会尝试覆盖 const 变量。const 变量位于 assingment 运算符的右侧,因此您的 for 循环正在读取const 变量,并且它不会覆盖任何内容(您的a变量是 for 循环块内可见的局部变量,因此在循环的a每次传递中都不同)。

即使您尝试覆盖 const 变量,也不会编译 - 尝试更改 const 会在编译时中断,而不是在运行时中断。

于 2013-05-03T13:34:07.437 回答
0
  1. 这段代码对我有用。
  2. 您最好不要将字符串转换为std::string并使用std::cout,而是使用QTextStream用于输出:

    QTextStream out(stdout);
    //...
    QString filena=list[i].fileName();
    out << filena << endl;
    
于 2013-05-03T13:33:25.730 回答
0

我的钱将用于混合 Qt 框架的调试版本和已编译程序的发布版本。

特别是在 Windows 下,在调试和发布版本中使用了不同的堆管理器。

尝试在调试模式下重新编译,看看会发生什么。

于 2013-05-03T13:37:19.167 回答