Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kvrus от Август 13, 2012, 09:52



Название: Помогите с наследованием сигнала
Отправлено: kvrus от Август 13, 2012, 09:52
Есть базовый класс (наследник QTabWidget) который содержит в себе обработчики события драг и дропа, и содержит
сигнал, который испускается когда драг и дроп произошел над экземпляром этого класса.
Дальше есть несколько классов наследников, которые хотят заполучить эту возможность отлавливать драг и дроп
и испускать сигнал. После запуска приложения выводится сообщение QObject::connect: No such signal B::change(int, int)
такая запись на все экземпляры, и еще один раз пишет тоже самое но для родительского класса.
Я полагал, что сигналы - это приват область и они должны наследоваться.
В чем тогда прикол?


Название: Re: Помогите с наследованием сигнала
Отправлено: _OLEGator_ от Август 13, 2012, 09:54
Код показывай


Название: Re: Помогите с наследованием сигнала
Отправлено: kvrus от Август 13, 2012, 10:04

Это родитель:
class Plotter : public QTabWidget{
    Q_OBJECT
    QImage  m_plotterIcon;
    QString m_name;
public:
    explicit Plotter(QWidget *parent = 0);
    QImage getIcon() const{
        return m_plotterIcon;
    }
    int plotterID;
    QString getName() const{
        return m_name;
    }
signals:
    void changePlot(int currentPlotter, int nextPlotter);
protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
    void dropEvent(QDropEvent *event);
};
от него наследуются все перечисленные ниже классы вот по такому принципу:
class evmplot : public QTabWidget

Это коннекты в bg_w.cpp
    connect(timeplotter, SIGNAL(changePlot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(freqplotter, SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(constellationplotter, SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(vectorplotter, SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(Ieyeplotter, SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(Qeyeplotter, SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(spectrogramplotter, SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(symtableplotter,SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(evmplotter,SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
Это в консоли приложения после запуска:
Object::connect: No such signal TimePlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:26
Object::connect: No such signal FreqPlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:27
Object::connect: No such signal ConstellationPlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:28
Object::connect: No such signal VectorPlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:29
Object::connect: No such signal EyePlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:30
Object::connect: No such signal EyePlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:31
Object::connect: No such signal SpectrogramPlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:32
Object::connect: No such signal SymTablePlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:33
Object::connect: No such signal Plotter::change_plot(int,int) in ..\VSA\bg_w.cpp:34
D:\ASP\prg2012\VSA-build-desktop\debug\VSA.exe завершился с кодом 0



Название: Re: Помогите с наследованием сигнала
Отправлено: kvrus от Август 13, 2012, 10:05
Ой)))) напутал чуток)))


Название: Re: Помогите с наследованием сигнала
Отправлено: kvrus от Август 13, 2012, 10:08



Просмотр профиля Email Личное сообщение (Online)
   
   
Re: Помогите с наследованием сигнала
« Ответ #2 : Сегодня в 10:04 »
   ПроцитироватьЦитировать Редактировать сообщениеИзменить Удалить сообщениеУдалить

Это родитель:
class Plotter : public QTabWidget{
    Q_OBJECT
    QImage  m_plotterIcon;
    QString m_name;
public:
    explicit Plotter(QWidget *parent = 0);
    QImage getIcon() const{
        return m_plotterIcon;
    }
    int plotterID;
    QString getName() const{
        return m_name;
    }
signals:
    void changePlot(int currentPlotter, int nextPlotter);
protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
    void dropEvent(QDropEvent *event);
};
от него наследуются все перечисленные ниже классы вот по такому принципу:
class EvmPlotter : public Plotter - Вот это наследник

Это коннекты в bg_w.cpp
    connect(timeplotter, SIGNAL(changePlot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(freqplotter, SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(constellationplotter, SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(vectorplotter, SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(Ieyeplotter, SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(Qeyeplotter, SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(spectrogramplotter, SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(symtableplotter,SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
    connect(evmplotter,SIGNAL(change_plot(int,int)),this, SLOT(setCurrentIndex(int,int)));
Это в консоли приложения после запуска:
Object::connect: No such signal TimePlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:26
Object::connect: No such signal FreqPlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:27
Object::connect: No such signal ConstellationPlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:28
Object::connect: No such signal VectorPlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:29
Object::connect: No such signal EyePlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:30
Object::connect: No such signal EyePlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:31
Object::connect: No such signal SpectrogramPlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:32
Object::connect: No such signal SymTablePlotter::change_plot(int,int) in ..\VSA\bg_w.cpp:33
Object::connect: No such signal Plotter::change_plot(int,int) in ..\VSA\bg_w.cpp:34
D:\ASP\prg2012\VSA-build-desktop\debug\VSA.exe завершился с кодом 0


Название: Re: Помогите с наследованием сигнала
Отправлено: _OLEGator_ от Август 13, 2012, 10:09
Ты издеваешься блин?!
У тебя сигнатура сигнала changePlot, а ты используешь неизвестный сигнал change_plot


Название: Re: Помогите с наследованием сигнала
Отправлено: kvrus от Август 13, 2012, 10:11
елы палы!
Спасибо большое. Сижу все привожу к единому стилю в проекте вот и получилась запарка


Название: Re: Помогите с наследованием сигнала
Отправлено: _OLEGator_ от Август 13, 2012, 10:12
Рефакторинг? Не, не слышал.
Есть средства для рефакторинга, а ты все руками походу делаешь.


Название: Re: Помогите с наследованием сигнала
Отправлено: kvrus от Август 13, 2012, 10:14
сейчас покурю по автоматизированным средствам. Еще раз спасибо.


Название: Re: Помогите с наследованием сигнала
Отправлено: _OLEGator_ от Август 13, 2012, 10:16
Если ты используешь Qt Creator, то помоему там есть встроенные средства для рефакторинга.


Название: Re: Помогите с наследованием сигнала
Отправлено: Serr500 от Август 13, 2012, 16:46
Да там точно есть. Правой крысой по объекту и в меню "Рефакторинг".