qt / c ++动态命名变量

时间:2012-12-18 10:22:24

标签: c++ qt variables

我正在Qt中为我的一项大学任务开发一个html编辑器,我遇到了一些关于某些变量命名的问题。

问题是:

当用户决定加载他们的"项目"程序遍历文件夹并查找其中有多少.html文件,然后创建标签以供显示。

我有一个自定义的QTextEdit,它有一个客户完成和语法高亮等等。我现在遇到的问题是如何根据需要的数量创建它们。

我创建一个文件名的QStringList:

QStringList m_files;
            m_files = aDialog.m_loadDirectory->entryList(QStringList("*.html"),QDir::Files|QDir::NoSymLinks);

然后我遍历列表中的每一个:

for(int i=0; i<m_files.count();i++)
{

}

并且对于每一个我需要创建一个新的自定义QtextEdit

TextEdit *name = new TextEdit;

然后添加到标签

tabs->addTab(name,"someTitle");

但由于每个标签的每个TextEdit需要不同(我认为这是正确的)我需要为每个标签使用不同的变量名称。

我考虑过创建一个TextEdit对象的列表/数组,但由于我不知道我需要使用多少,我可能会因为太多(浪费的内存)或者不够而容易结束。

关于我如何解决这个问题的任何想法?

一个想法......

是否可以在循环

之前创建TextEdit对象

然后在循环中复制该对象并将复制的对象添加到选项卡中? (仍然是变量命名问题......)

感谢

2 个答案:

答案 0 :(得分:4)

  

但是每个标签的每个TextEdit需要不同(我认为这是正确的)

是的,您需要在每个标签中添加不同的TextEdit

  

我需要为每个变量名称使用不同的变量名称。

不,您不需要为每个变量名称使用不同的变量名称。您需要不同的对象,但变量名称与此无关。

简单:

for (...) {
   TextEdit *te = new TextEdit(...);
   // set up that text edit in whatever way you need
   tabs->addWidget(te, "foo");
}

完全符合您的要求。变量名te完全不相关(它甚至不会出现在调试符号之外的可执行文件中)。每次循环,您都将处理单独的TextEdit实例。

如果您需要在运行时按名称引用该TextEdit,则可以将所有小部件保留在集合中,例如QMap

 QMap<QString, QWidget*> all_editors;
 ...

 for (...) {
    TextEdit *te = ...;
    all_editors[filename] = te;
    ...
 }

答案 1 :(得分:1)

您已经快速放弃了唯一可行的解​​决方案:将文本编辑放入集合中。 textedit 必须使用 new 创建 ,因此集合本身不会浪费空间。

对于最简单的情况,您可以使用QPair<QTabWidget*, QTextEdit*>。对于更复杂的情况,请创建自定义窗口小部件,然后列出这些窗口小部件。

复制QObject是一个非常糟糕的主意。我认为复制构造函数是私有的,所以你甚至无法做到这一点