Динамическое именование переменных в qt/ C++
Я нахожусь в процессе разработки html-редактора в Qt для одного из моих университетских заданий, и у меня возникла проблема с присвоением имен некоторым переменным.
проблема заключается в следующем:
когда пользователь решает загрузить свой "проект", программа перебирает папку и находит, сколько там файлов.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 ответа
но так как каждый 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;
...
}
Вы быстро отменили единственное жизнеспособное решение: поместите свои текстовые правки в коллекцию. Текст должен быть создан с новым, так что сама коллекция не будет тратить пространство.
Вы можете использовать QPair<QTabWidget*, QTextEdit*>
для самых простых случаев. Для более сложных случаев создайте собственный виджет и просто составьте список из них.
Копирование QObject
это действительно плохая идея. Я думаю, что конструктор копирования является частным, так что вы даже не сможете сделать это