我正在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对象然后在循环中复制该对象并将复制的对象添加到选项卡中? (仍然是变量命名问题......)
感谢
答案 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
是一个非常糟糕的主意。我认为复制构造函数是私有的,所以你甚至无法做到这一点