Пользовательские QGraphicsItems не компилируются и дают объект как частную ошибку

Я пытаюсь создать пользовательскую кнопку QGraphicsItem, как показано Фредом здесь. Код, который он опубликовал, можно найти здесь.

Проблема в том, что когда я пытаюсь скомпилировать код, я получаю следующие две ошибки:

  • /usr/include/qt4/QtGui/qgraphicsitem.h ‘QGraphicsItem::QGraphicsItem(const QGraphicsItem&)’ является закрытым
  • /usr/include/qt4/QtCore/qobject.h
    ‘QObject::QObject(const QObject&)’ является приватным

Вот фрагмент кода, который по сути такой же, как в приведенном выше примере. Ошибка в замедлении класса.

class MyButton : public QObject, public QGraphicsItem
{
 Q_OBJECT
 Q_INTERFACES(QGraphicsItem)

public:
 MyButton(QGraphicsItem *parent = 0);
 MyButton(const QString normal, const QString pressed = "", QGraphicsItem *parent = 0);
....
}

Интересно, что другой образец, показанный здесь, работает нормально. Пример кода для этого можно найти здесь.

Есть идеи, что не так? Заранее спасибо.


person bahree    schedule 20.04.2010    source источник
comment
Я получаю другую ошибку - button.h:31: Error: Undefined interface. Я использую Qt 4.5.2. Требуется ли 4.6?   -  person Troubadour    schedule 21.04.2010
comment
@Troubadour, я использую v4.5.0, и второй образец, как я указал, работает. Так что это должно работать на v4.5.2. Конечно, учитывая, что я получаю эту ошибку, не уверен, что мне следует советовать об этом. :)   -  person bahree    schedule 21.04.2010
comment
Спасибо. Другой образец, да и другие из того же места, у меня все в порядке. Возможно, разница в версии Qt является причиной другой ошибки. Боюсь, я понятия не имею, почему возникает та или иная ошибка, хотя пример отлично строится, если вы удалите макрос Q_INTERFACES в строке 31. Хорошая это идея или нет, конечно... ;)   -  person Troubadour    schedule 21.04.2010
comment
@Troubadour Да, вчера я обнаружил то же самое, и это кажется работает; не уверен, что все ломается (если что). Если ничего не ломается, то непонятно, зачем это вообще было нужно. Хотя я до сих пор не понимаю, почему это не удалось. Спасибо, что отозвались. Хорошо, если кто-то еще подтвердит то же самое. Ценить это.   -  person bahree    schedule 22.04.2010


Ответы (1)


Эти ошибки выглядят как попытка скопировать объект кнопки. Компилятор пытается автоматически сгенерировать конструктор копирования MyButton и терпит неудачу, потому что конструктор копирования QObject (который является вашей базой кнопок) является закрытым. Помимо ошибок, которые вы перечислили, вы также должны увидеть такие вещи, как:

note: synthesized method 'MyButton::MyButton(const MyButton&)' first required here

с именем исходного файла и номером строки после этого сообщения. Если вы не видите это сообщение, попробуйте добавить:

private:
    Q_DISABLE_COPY(MyButton)

к определению класса MyButton. Тогда вы должны увидеть это:

error: 'MyButton::MyButton(const MyButton&)' is private within this context
person chalup    schedule 20.04.2010
comment
Привет, извините, что не ответил раньше. Добавление Q_DISABLE_COPY не помогло; как я прокомментировал выше, удаление макроса Q_INTERFACES исправило это. Или так кажется. :) - person bahree; 22.04.2010