我想选择一个文件并将文件名存储为我的QT表单的char *
成员变量。我有以下
void MainWindow::SelectVolFile(){
QString qFileName = QFileDialog::getOpenFileName(this,
tr("Select VOL file..."), QDir::currentPath(), tr("Files (*.VOL)"));
if (!qFileName.isEmpty()){
QByteArray byteFileName = qFileName.toLatin1();
this->fileName = byteFileName->data();
}
}
但是,我认为一旦此函数返回,byteFileName->data()
超出范围。什么是解决这种情况的好方法?我不确定我应该把哪个变量放在堆上。
答案 0 :(得分:2)
这在很大程度上取决于this->fileName
。如果fileName
是char*
,那么您是对的:byteFileName
超出范围,byteFileName->data()
将被取消分配,这会导致悬空指针,{{1} }。
解决此类情况的最简单方法是将this->fileName
的类型设置为this->fileName
,QString
或实际复制std::string
内容的其他类型。< / p>
答案 1 :(得分:1)
您可以将this->filename
定义为QString
,它会起作用。
如果要对文件名使用char*
,则应使用new
在该函数中分配内存并将byteFileName->data()
复制到该函数中。
this->filename = new char[strlen(byteFileName->data())+1];
strcpy(this->filename, byteFileName->data());
答案 2 :(得分:0)
为了最好,请不要将qFileName转换为其他任何内容(fileName字段必须更改为QString):
void MainWindow::SelectVolFile(){
QString qFileName = QFileDialog::getOpenFileName(this,
tr("Select VOL file..."), QDir::currentPath(), tr("Files (*.VOL)"));
if (!qFileName.isEmpty()){
this->fileName = qFileName;
}
}
使用您的代码,您将无法正确处理名称中包含latin1字符集之外的字符的文件。
答案 3 :(得分:0)
一般来说,我可以想到三种可能的解决方案:
我会选择最容易使用给定库的那个。