0

大家好,感谢您的时间,

我在 QList 中读取文件名。这就是我所做的:

QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::ExistingFiles);
dialog.setViewMode(QFileDialog::Detail);
if(dialog.exec()) {
    files.append(dialog.selectedFiles());
}
foreach(QString file, files) {
    // add files to a table
}

我在 QList 文件中有所有文件。现在我希望用户将信息添加到此列表中。在 PHP(或 javascript)中,我会做这样的事情:

$fileinformation = array();
foreach($files AS $file) {
    array_push($fileinformation, array (
                                       'filename'   => $file,
                                       'doAction1'  => false,
                                       'doAction2'  => true,
                                       'parameter2' => array (
                                                              'value1' => $val1,
                                                              'value2' => $val2
                                                       )
                                       )
    )
}

在下一步中,我将允许用户通过编辑来编辑默认选项$fileinformation['parameter2']['value']。但是我怎么能在 QT 中做到这一点?我知道,qt 中有某些函数,如 QList 和 QMap,但对于这种情况,它们都不是多维的并且太不灵活。

我错过了什么?

4

1 回答 1

1

你没有错过任何东西。在静态类型语言中,通常不会在同一个容器中拥有完全不同类型的对象。

假设所有参数都在编译时定义,您可以定义包含这些参数的类或结构并将其存储在列表中。为简洁起见,我在此示例中使用了原始结构。您可能希望使用构造函数显式初始化其成员,并可能将其数据包装到有意义的类中。

struct FileInformation
{
   QString filename;
   bool doAction1;
   bool doAction2;

   struct ParameterStruct
   {
      QString value1; // I'm guessing it's QString, since you don't show what type it was.
      QString value2;
   } parameter2;
};

int main()
{
   QList<FileInformation> myList;
   FileInformation info;
   info.fileName = "filename.txt";
   info.doAction1 = false;
   info.doAction2 = true;
   info.parameter2.value1 = "someValue";
   info.parameter2.value2 = "someOtherValue";
   myList.append(info);

   //now to change stuff!
   myList[0].parameter2.value1 = "a new value";
}

可以更类似于上面的示例(通过嵌套 QVariantMaps)来执行此操作,但这会非常难看,因为 C++ 的静态类型需要在每次访问时手动转换。

于 2012-06-30T01:08:57.867 回答