Динамическое именование переменных в 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 это действительно плохая идея. Я думаю, что конструктор копирования является частным, так что вы даже не сможете сделать это

Другие вопросы по тегам