Russian Qt Forum
Октябрь 01, 2024, 02:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Ошибка в классе использующий emit.  (Прочитано 6141 раз)
Oleg_IT
Гость
« : Октябрь 17, 2012, 11:30 »

Простой тестовый класс, взял из примеров, вместо QDeclarativeItem подставил QLabel.

Код:
#include <QtGui>
class PieChart : public QLabel
{
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName)
    Q_PROPERTY(QColor color READ color WRITE setColor)
public:
    PieChart(QLabel *parent = 0);
    QString name() const;
    void setName(const QString &name);
    QColor color() const;
    void setColor(const QColor &color);
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
    Q_INVOKABLE void clearChart();
signals:
    void chartCleared();
private:
    QString m_name;
    QColor m_color;
};
PieChart::PieChart(QLabel *parent)
    : QLabel(parent)
{
    // need to disable this flag to draw inside a QDeclarativeItem
    //setFlag(QGraphicsItem::ItemHasNoContents, false);
}
QString PieChart::name() const
{
    return m_name;
}
void PieChart::setName(const QString &name)
{
    m_name = name;
}
QColor PieChart::color() const
{
    return m_color;
}
void PieChart::setColor(const QColor &color)
{
    m_color = color;
}
void PieChart::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
    QPen pen(m_color, 2);
    painter->setPen(pen);
    painter->setRenderHints(QPainter::Antialiasing, true);
    //painter->drawPie(boundingRect(), 90 * 16, 290 * 16);
}
void PieChart::clearChart()
{
    setColor(QColor(Qt::transparent));
    update();
    emit chartCleared();
}

Компилятор выдаёт ошибки
…\TestEmit.cpp:33: ошибка: undefined reference to `vtable for PieChart'
…\TestEmit.cpp:72: ошибка: undefined reference to `PieChart::chartCleared()'

Не пойму проблему. Программа пример, из которой взял код компилится без ошибок.

Записан
mutineer
Гость
« Ответ #1 : Октябрь 17, 2012, 11:32 »

Это все в одном файле написано?
Очистить результаты сборки и полностью заново пересобрать (с выполнением qmake) пробовал?
Записан
Oleg_IT
Гость
« Ответ #2 : Октябрь 17, 2012, 12:11 »

Пробовал и в одном файле и в разных. Наткнулся на эту проблему когда штатный класс делал в разных файлах, очищал, пересобирал не помогает. MOC-и не создаются. Может где какую галочку поставить нужно?
Сейчас посмотрел, месяц назад делал похожий класс с QAbstractSlider, работает, а принципиальной разницы в классах не вижу.
Записан
Vass
Гость
« Ответ #3 : Октябрь 17, 2012, 12:41 »

Если Вы объявляете в cpp файле  класс наследник QObject то в конце файла необходимо сделать
Код:
#inlcude "moc_<имя файла>.cpp"

выглядит странно, но без этого вы получаете ошибки описанные выше.
Записан
Bepec
Гость
« Ответ #4 : Октябрь 17, 2012, 12:54 »

Кхм. И вы убиваете возможность использования других IDE. Ибо в VS2008 (проверено) эти строки убьют проект на стадии компиляции Улыбающийся
Записан
Serr500
Гость
« Ответ #5 : Октябрь 17, 2012, 13:05 »

Разделите интерфейс и реализацию. Интерфейс (объявление) - в h, реализацию - в cpp.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #6 : Октябрь 17, 2012, 13:10 »

Если Вы объявляете в cpp файле  класс наследник QObject то в конце файла необходимо сделать
Код:
#inlcude "moc_<имя файла>.cpp"

выглядит странно, но без этого вы получаете ошибки описанные выше.
а разве не #inlcude "<имя файла>.moc"?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #7 : Октябрь 17, 2012, 13:13 »

Нет. moc делает moc_ИмяФайла.cpp Улыбающийся
Записан
Oleg_IT
Гость
« Ответ #8 : Октябрь 17, 2012, 14:07 »

Цитировать
Если Вы объявляете в cpp файле  класс наследник QObject то в конце файла необходимо сделать
Код:

#inlcude "moc_<имя файла>.cpp"


выглядит странно, но без этого вы получаете ошибки описанные выше.
тут же выдаёт ошибку
ошибка: moc_<имя_файла>.cpp: No such file or directory

И в других, работающих проектах я такой записи не вижу.

Цитировать
ошибка: moc_<имя_файла>.cpp: No such file or directory
Делал так, не помогает.


Убираю Q_OBJECT ошибок нет, но и всё, что касается emit не работает.
Записан
mutineer
Гость
« Ответ #9 : Октябрь 17, 2012, 14:08 »

Выложи проект уже, надоело в угадайку играть
Записан
Serr500
Гость
« Ответ #10 : Октябрь 17, 2012, 14:30 »

Ещё раз:
Разделите интерфейс и реализацию. Интерфейс (объявление) - в h, реализацию - в cpp.
Записан
Oleg_IT
Гость
« Ответ #11 : Октябрь 17, 2012, 15:09 »

Ошибся
Цитировать
Цитировать
ошибка: moc_<имя_файла>.cpp: No such file or directory
Делал так, не помогает.
Правильно так:
Цитировать
Разделите интерфейс и реализацию. Интерфейс (объявление) - в h, реализацию - в cpp
Делал так, не помогает.

Записан
Serr500
Гость
« Ответ #12 : Октябрь 17, 2012, 15:11 »

Делал так, не помогает.
Проект в студию! Будем посмотреть.
Записан
Oleg_IT
Гость
« Ответ #13 : Октябрь 18, 2012, 08:36 »

Прошу прощения, но проект в студию не получится, уже не чего. Какими-то манипуляциями, что-то изменил и проект собрался и заработал. К сожалению я так и не понял, что произошло. Если такая проблема опять возникнет, вопрос вместе с проектом обязательно выложу.
Записан
ssoft
Гость
« Ответ #14 : Октябрь 18, 2012, 12:32 »

Просто после разделения на *.h и *.cpp нужно обязательно вызывать qmake. Иначе, все равно не соберется.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.117 секунд. Запросов: 23.