Qt, клонирование QObject
От: pproger  
Дата: 27.01.12 11:16
Оценка:
Добрый день. Делаю своеобразный редактор. Создаю иерархию классов. Базовый класс в ней (назовем RBase) наследуется от QWidget. Хочу, чтоб любой визуальный объект в редакторе можно было скопировать (выделили объект — копировать). Для этого в RBase добавил

virtual RBase *clone() const = 0;

чтобы в конкретных классах ее переопределять. каждый новосозданный объект создает некоторые соединения сигнал-слот.

Вопрос. как правильно скопировать QWidget, если конструктор копирования у него закрыт? открывать не предлагать. В итоге нужно создать идентичный объект (с такими же QWidget свойствами, такими же соединениями сигнал-слот).

Сейчас свойства копирую через мета информацию объекта (property(), setProperty()). Как скопировать инфу о соединениях не знаю. Заново вызывать для нового объекта connect не хотелось бы. Все коннекшены создаются в MainWindow, и лезть туда не хочется. Хочется извлечь эту инфу из копируемого объекта.

Заранее спасибо.
Re: Qt, клонирование QObject
От: Sheridan Россия  
Дата: 30.01.12 18:59
Оценка:
Здравствуйте, pproger, Вы писали:

Я бы нарисовал фабрику классов, которая возвращает по запросу нужные мне виджеты...
Копировать проперти конечно можно, но имеет смысл только в случае если эти проперти изменяются непредсказуемо, тоесть редактируются пользователем так или иначе.
Коннектить сигналы-слоты необязательно в майнвиндов, я бы сразу фабрикой их и коннектил....
Ну тоесть чтототипа написал бы:


QWidget *some::generate(const QWidget *w = NULL)
{
  QWidget *result = new QWidget();
  // устанавливаем нужные свойства
  // коннектим к слотам
  if(w)
  {  
    // копируем из
  }
  return result;
}



А вообще все от задачи зависит. Я не знаю, зачем тебе понадобилось копирование, возможно поставленная тобой перед собой задача решается по другому...

ps Пишу не читая комменты, такшо прошу прощения заранее, ежели что
Matrix has you...
Re[2]: Qt, клонирование QObject
От: Аноним  
Дата: 31.01.12 07:57
Оценка:
Здравствуйте, 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 ???
}
Re[3]: Qt, клонирование QObject
От: Sheridan Россия  
Дата: 31.01.12 12:57
Оценка:
Значит соединения создавать не классически, а посредством написанного метода, с сохранением параметров. Например нарисовать структуру, заполнять ее и в кулист сохранять. А потом по кулисту проходить в новом объекте и коннектить...
Matrix has you...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.