2

我正在为我的一项大学作业在 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 对象

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

谢谢

4

2 回答 2

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;
    ...
 }
于 2012-12-18T10:34:07.207 回答
1

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

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

复制 aQObject是一个非常糟糕的主意。我认为复制构造函数是私有的,所以你甚至不能这样做

于 2012-12-18T10:27:57.660 回答