Название: Связывание кнопки со слотом Отправлено: SpiritFire от Ноябрь 16, 2009, 21:07 Извините за глупый вопрос, но пол дня про тр(CENSORED)лся с этой ерундой, ни черта понять не могу. Подскадите, пожалуйста, в чем я туплю?
Есть кнопка с произвольным внешним видом, добавляемая на виджет во время выполнения. Надо определить ее поведение при нажатии мыши (честно говоря и при вызове контекстного меню, но до него еще дожить надо). Определил класс кнопки: Код: #ifndef MARKBUTTON_H Написал обработчики: Код: #include "MarkButton.h" Добавил ее на виджет: Код: void f(QWidget* buttonPlace) Комментарии: // -- 1: Если строку раскомментировать не компилится: Цитировать ../src/MarkButton.cpp:7: undefined reference to `vtable for MarkButton' :-1: error: collect2: ld returned 1 exit status // -- 2: Если строку закомментировать, обработчик не вызывается, если оставить - хз что вызывается, но на клике возникает сигнал в дебрях системы, прога падает. Объясните пожалуйста дятлу, каким образом добавить кнопку на виджет во время выполнения и связвать её с обработчиком? Название: Re: Связывание кнопки со слотом Отправлено: lit-uriy от Ноябрь 16, 2009, 21:24 Цитировать // -- 1: Если строку раскомментировать не компилится: запусти qmake, для всех наследников QObject, сразу определяй макрос Q_OBJECT, чтобы потом опять qmake не запускать, когда тебе этот макрос вдруг приспичетНазвание: Re: Связывание кнопки со слотом Отправлено: MoPDoBoPoT от Ноябрь 16, 2009, 21:37 Во-первых, Q_OBJECT нужен для использования сигнал-слотов (еще для свойств и tr(), по-моему), во-вторых,
если ты создал некий класс (без Q_OBJECT) и делаешь qmake, а затем решил добавить Q_OBJECT, то компиляция не пройдет, т.к. надо по новой сгенерировать Makefile. Название: Re: Связывание кнопки со слотом Отправлено: SpiritFire от Ноябрь 17, 2009, 01:39 Цитировать запусти qmake, Да qmake я запускал, точнее не я, а QtCreator. Проблема нашлась, когда сделал тестовый проект и потихонбку навешивал на него все то, что в реальном. Вот так работает:Код: #ifndef BUTTONCREATOR_H Код: #include "buttoncreator.h" Если сделать порядок наследования наоборот (:public QGraphicsItem, public QObject), тогда сыпятся ошибки. Не знаю, с чем связано, да и ковырять в 12 ночи неохота. Здесь первоначальный вариант, класс, создающий кнопку - это потомок QGraphicsItem, потом так как этот не прошел попробовал коннектить сигнал в переопределенном классе кнопки, видимо, там та же беда с наследованием. В любом случае постараюсь избежать множественного наследования в реальной задаче. Проблема решена, всем спасибо за участие, но если кто для общего развития прольет свет на то, почему от порядка наследования зависит успешность компиляции - буду весьма принателен. Исходники прилагаются. Название: Re: Связывание кнопки со слотом Отправлено: Авварон от Ноябрь 17, 2009, 09:49 В доке написано, что при наследовании QObject должен первым стоять. На деле выходит так, что у тебя класс-родитель (не обязательно QObject, но его наследник) должен содержать мета-информацию. Моку лень видимо смотреть всю иерархию чтобы самому определить какой из классов-предков твоего класса - наследник QObject
|