Добрый день. Делаю своеобразный редактор. Создаю иерархию классов. Базовый класс в ней (назовем RBase) наследуется от QWidget. Хочу, чтоб любой визуальный объект в редакторе можно было скопировать (выделили объект — копировать). Для этого в RBase добавил
virtual RBase *clone() const = 0;
чтобы в конкретных классах ее переопределять. каждый новосозданный объект создает некоторые соединения сигнал-слот.
Вопрос. как правильно скопировать QWidget, если конструктор копирования у него закрыт? открывать не предлагать. В итоге нужно создать идентичный объект (с такими же QWidget свойствами, такими же соединениями сигнал-слот).
Сейчас свойства копирую через мета информацию объекта (property(), setProperty()). Как скопировать инфу о соединениях не знаю. Заново вызывать для нового объекта connect не хотелось бы. Все коннекшены создаются в MainWindow, и лезть туда не хочется. Хочется извлечь эту инфу из копируемого объекта.
Заранее спасибо.
Здравствуйте, pproger, Вы писали:
Я бы нарисовал фабрику классов, которая возвращает по запросу нужные мне виджеты...
Копировать проперти конечно можно, но имеет смысл только в случае если эти проперти изменяются непредсказуемо, тоесть редактируются пользователем так или иначе.
Коннектить сигналы-слоты необязательно в майнвиндов, я бы сразу фабрикой их и коннектил....
Ну тоесть чтототипа написал бы:
QWidget *some::generate(const QWidget *w = NULL)
{
QWidget *result = new QWidget();
// устанавливаем нужные свойства
// коннектим к слотам
if(w)
{
// копируем из
}
return result;
}
А вообще все от задачи зависит. Я не знаю, зачем тебе понадобилось копирование, возможно поставленная тобой перед собой задача решается по другому...
ps Пишу не читая комменты, такшо прошу прощения заранее, ежели что
Здравствуйте, Sheridan, Вы писали:
S>Копировать проперти конечно можно, но имеет смысл только в случае если эти проперти изменяются непредсказуемо, тоесть редактируются пользователем так или иначе.
именно пользователь и редактирует эти проперти. фабрика у меня есть. проблема в том, что одинаковые виджеты могут иметь различные соединения, и в момент клонирования мне нужно это узнать.
пример
class RBase : public QWidget {
....
virtual RBase *clone() const = 0;
....
};
class RTable : public RBase {
...
// переопределяем виртуальный метод, используя ковариантность
virtual RTable *clone() const
{
RTable *table = new RTable(this->parentWidget());
...
return table;
}
...
};
RTable table1;
table1.connect(...);
table1.connect(...);
table1.connect(...);
RTable table2;
table2.connect(...);
// слот кнопки Копировать
void copy(RBase *obj)
{
RBase *newObj = obj->clone();
newObj->show();
// ??? какие соединения установить для newObj ???
}
Значит соединения создавать не классически, а посредством написанного метода, с сохранением параметров. Например нарисовать структуру, заполнять ее и в кулист сохранять. А потом по кулисту проходить в новом объекте и коннектить...