对于刚练习,使用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
)给出了Heap错误。我知道摆脱这个错误的替代是使用toLocal8Bit().constData()
,但我很好奇是什么是toStdString提供的堆错误背后的主要原因。是因为它是const
类型而且我的for循环每次尝试覆盖const变量吗?
答案 0 :(得分:2)
您的代码看起来很好 - 确保您使用相同的编译器(以及使用相同的调试/发布配置)编译Qt的dll文件。
回答你的一些问题:
是因为它是const类型而且我的for循环每次尝试覆盖const变量吗?
不,你的for循环不会试图覆盖const变量。 const变量位于assingment运算符的右侧,因此for循环从const变量读取,并且它不会覆盖任何内容(您的a
变量是可见的局部变量循环的块,因此a
在循环的每次传递中都是不同的。)
即使您尝试覆盖const变量,也不会编译 - 尝试更改const将在编译时中断,而不是在运行时。
答案 1 :(得分:0)
您最好不要将字符串转换为std::string
并使用std::cout
,而是使用QTextStream
作为输出:
QTextStream out(stdout);
//...
QString filena=list[i].fileName();
out << filena << endl;
答案 2 :(得分:0)
我的钱是将Qt Framework的Debug版本与已编译程序的Release版本混合。
特别是在Windows下,在调试和发布版本中使用了不同的堆管理器。
尝试在调试模式下重新编译,看看会发生什么。