2010-04-20 8 views
1

Я пытаюсь создать пользовательскую кнопку QGraphicsItem, как показано Fred here. Код, который он опубликовал, можно найти here.Пользовательские QGraphicsItems не компилируются и дают ошибку «объект является приватным»

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

  • /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); 
.... 
} 

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

Любая идея, что не так? Заранее спасибо.

+0

У меня другая ошибка - «button.h: 31: Ошибка: Неопределенный интерфейс». Я использую Qt 4.5.2. Требуется ли 4.6? – Troubadour

+0

@Troubadour, я использую v4.5.0, а второй образец, как я указал, работает. Поэтому он должен работать на v4.5.2. Конечно, учитывая, что я получаю эту ошибку, не уверен, если я буду советоваться об этом. :) – bahree

+0

Спасибо. Другой образец, и даже другие из того же места, все строят отлично для меня. Возможно, разница в версии Qt является причиной различной ошибки. Боюсь, я не знаю, почему возникает ошибка, хотя пример действительно строит, если вы удаляете макрос Q_INTERFACES по строке 31. Является ли это хорошей идеей или нет, конечно ...;) – Troubadour

ответ

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 
+0

Привет, извините, я раньше не звонил. Добавление Q_DISABLE_COPY не исправило это; как я уже отмечал выше, удаление макроса Q_INTERFACES исправлено. Или так кажется. :) – bahree