LINUX.ORG.RU

QT: Регистрирование своих сигналов

 , ,


0

0

Ребят, может кто сталкивался с проблемой?

Создаю класс на основе существующего QTreeWidget, все вроде хорошо, но если пытаюсь зарегистрировать свой сигнал, при компиляции получаю ошибку:

:-1: error: symbol(s) not found for architecture x86_64
:-1: error: collect2: ld returned 1 exit status

Поиск показал что MOC не хочет «встраивать» cвой код, но с другой стороны пишут что при использовании qmake и задании в коде Q_OBJECT все должно работать..

Подскажите пожалуйста, в чем грабли и как правильно?

код элементарный:

#ifndef MYTREELIST_H
#define MYTREELIST_H

#include <QObject>
#include <QTreeWidget>
#include <QDragMoveEvent>
#include <QDragLeaveEvent>
#include <QTreeWidgetItem>

class myTreeList : public QTreeWidget
{
    Q_OBJECT

public:
    myTreeList();
    ~myTreeList();

protected:

    void dropEvent(QDropEvent *e);

signals:
    void itemWasMoved(QTreeWidgetItem*, QTreeWidgetItem*);

};

#endif // MYTREELIST_H
#include "mytreelist.h"
#include <QDebug>
#include <QDragEnterEvent>

myTreeList::myTreeList()
{

}

myTreeList::~myTreeList()
{

}

void myTreeList::dropEvent(QDropEvent *e)
{
    QTreeWidgetItem *pitem;
    pitem=currentItem();

    qDebug()<<"drop event:  "<<currentItem()->text(0);
    QTreeWidget::dropEvent(e);;
    qDebug()<<"drop event end:  "<<currentItem()->text(0);

    emit itemWasMoved(pitem,currentItem());
}

Естественно если в коде убираю строку

    emit itemWasMoved(pitem,currentItem());

то все компилируется на ура.. Но мне нужно генерировать событие при перемещении элемента.



Последнее исправление: asve79 (всего исправлений: 1)

Что ты имеешь в виду под «пытаюсь зарегистрировать свой сигнал»? emit? Этот символ препроцессора разворачивается в пустоту и не должен вообще влиять на результат компиляции. Твой код выглядит правильно, покажи .pro файл своего проекта.

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 1)

Похоже _moc.cpp был сгенерирован, скомпилирован с одними параметрами, а потом остальная программа была собрана с другими. Удалите обьектники. И вообще, пользуйтесь инкрементальными системами сборки вместо недоразумения под названием qmake.

Dendy ★★★★★
()

Удали всю директорию build.

p.s. Почему базовый класс не инициализируешь? Родителя в конструкторе не передаешь, за памятью руками следишь, new-delete, вот это всё? Почему деструктор не виртуальный?

fluorite ★★★★★
()
Ответ на: комментарий от fluorite

Почему деструктор не виртуальный?

У базового класса деструктор виртуальный, так что с этим у него все в порядке ;-)

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

Я когда protected вижу, ожидаю, что класс можно наследовать. Так что или крестик снять (protected), или трусы надеть (virtual ~), ИМХО.

fluorite ★★★★★
()
Ответ на: комментарий от fluorite

Так его как раз можно наследовать, потому что в базовом классе (QObject) деструктор виртуальный (точнее все деструкторы виртуальные, несмотря на отсутствие явного virtual). Посмотри этот пример:

#include <iostream>

class A {
public:
	virtual ~A() { std::cout << "~A" << std::endl; }
};

class B : public A {
public:
	~B() { std::cout << "~B" << std::endl; }
};

class C : public B {
public:
	~C() { std::cout << "~C" << std::endl; }
};

int main()
{
	C* c = new C;
	A* a = c;
	delete a;
	return 0;
}

Выхлоп:

~C
~B
~A

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

Ты про legal, а я про moral. Такой код заставляет смотреть хидеры классов, которые как бы особо и не нужны тебе. Вот если есть protected и virtual ~B(), я понимаю, что скорее всего коллега озаботился вопросом наследования и использования его класса.

fluorite ★★★★★
()
Последнее исправление: fluorite (всего исправлений: 1)

Проблему решил..

Видимо действительно был какой-то странный баг…

Я вернул проект на состояния «до внедрения указанного класса», и сделал все заново (заново написал класс, дабы кода в нем кот наплакал), но на QT5. Все написанное почти точь-в-точь заработало без ошибок. Принес на QT 4.6 - и тут также процесс завелся «как родной» без ошибок.

Возможно действительно оставались какие-то старые модули, хотя я делал «clean» на проект, может еще что-то, но факт некоего «волшебства» где-то в воздуе витает.

Всем спасибо! Из комментариев подчерпнул для себя интересную пищу для ума, так что они небыли напрасны.

asve79
() автор топика
Ответ на: Проблему решил.. от asve79

хотя я делал «clean» на проект

Чаще всего не помогает. Ставлю в запускаемых командах на сборку - rm -rf на директорию сборки перед make. Пусть на 5 секунд дольше компилируется, чем потом на эти грабли наступать.

sambist ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.