Название: Контекстное меню QGraphicsItem Отправлено: iukash от Январь 25, 2011, 12:14 Взял из документации это
Цитата:void CustomItem::contextMenuEvent(QGraph icsSceneContextMenuEvent *event) { QMenu menu; QAction *removeAction = menu.addAction("Remove"); QAction *markAction = menu.addAction("Mark"); QAction *selectedAction = menu.exec(event->screenPos()); // а что дальше? как прикрутить слот? } Делаю так Цитата:QObject::connect(menu,SIGNAL(trigge red(QAction*)),SLOT(slot_message()) ); slot_message() - это public slots; Получаю такую ошибку Цитата:error: cannot call member function 'bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const' without object Название: Re: Контекстное меню QGraphicsItem Отправлено: alexman от Январь 25, 2011, 15:02 QObject::connect(menu,SIGNAL(trigge red(QAction*)),SLOT(slot_message()) );
что за пробел? Название: Re: Контекстное меню QGraphicsItem Отправлено: sadhu от Январь 25, 2011, 15:11 Посмотри повнимательнее чего то не хватает :)
можно или так : QObject::connect(pSender,SIGNAL(signal()),pReceiver,SLOT(slot()); или так: pReceiver->connect(pSender,SIGNAL(signal()),SLOT(slot()); Оба варианта эквивалентны. Название: Re: Контекстное меню QGraphicsItem Отправлено: sadhu от Январь 25, 2011, 15:17 QObject::connect(menu,SIGNAL(trigge red(QAction*)),SLOT(slot_message()) ); на этапе компиляцци на это ругаться не должно что за пробел? Название: Re: Контекстное меню QGraphicsItem Отправлено: iukash от Январь 25, 2011, 17:01 Цитировать QObject::connect(menu,SIGNAL(trigge red(QAction*)),SLOT(slot_message()) ); это просто при переносе на форум ошибсячто за пробел? Цитировать Посмотри повнимательнее чего то не хватает А как сделать так pReceiver это был как раз CustomItem, а слот - это его слот?можно или так : QObject::connect(pSender,SIGNAL(signal()),pReceiver,SLOT(slot()); или так: pReceiver->connect(pSender,SIGNAL(signal()),SLOT(slot()); Оба варианта эквивалентны. Цитировать void CustomItem::contextMenuEvent(QGraph icsSceneContextMenuEvent *event) { QMenu menu; QAction *removeAction = menu.addAction("Remove"); QAction *markAction = menu.addAction("Mark"); QAction *selectedAction = menu.exec(event->screenPos()); QObject::connect(&menu,SIGNAL(signal()),pReceiver,SLOT(slot_item()); } void CustomItem::slot_item() { QMessageBox::warning(0,QObject::tr("Предупреждение"),QObject::tr("Нажата Создать итем")); } } Название: Re: Контекстное меню QGraphicsItem Отправлено: alexman от Январь 25, 2011, 18:23 QObject::connect(menu,SIGNAL(trigge red(QAction*)),SLOT(slot_message()) ); на этапе компиляцци на это ругаться не должно что за пробел? Название: Re: Контекстное меню QGraphicsItem Отправлено: pastor от Январь 25, 2011, 18:38 Цитировать QObject::connect(&menu,SIGNAL(triggered(QAction*)),SLOT(slot_message()) ); Название: Re: Контекстное меню QGraphicsItem Отправлено: iukash от Январь 25, 2011, 20:14 Цитировать QObject::connect(&menu,SIGNAL(triggered(QAction*)),SLOT(slot_message()) ); Название: Re: Контекстное меню QGraphicsItem Отправлено: Kolobok от Январь 25, 2011, 21:02 Правду говорит.
Название: Re: Контекстное меню QGraphicsItem Отправлено: pastor от Январь 25, 2011, 21:18 Убери QObject::
Название: Re: Контекстное меню QGraphicsItem Отправлено: iukash от Январь 25, 2011, 21:26 Убери QObject:: Тогда он не видит connect, а если добавить Q_OBJECT в класс наследованный от QGraphicsItem то вылазиют какие то ошибки, сейчас нет кода под рукой точно сказать не могу какие! Название: Re: Контекстное меню QGraphicsItem Отправлено: pastor от Январь 25, 2011, 21:29 Так CustomItem у тебя наследник QGraphicsItem что ли? Необратил сразу на это внимание
Название: Re: Контекстное меню QGraphicsItem Отправлено: alexman от Январь 25, 2011, 21:31 Зачем тебе слот? Обрабатывай нажатие прямо в contextMenuEvent.
Название: Re: Контекстное меню QGraphicsItem Отправлено: pastor от Январь 25, 2011, 21:36 Если нужны слоты, то наследуйся от QGraphicsObject
Название: Re: Контекстное меню QGraphicsItem Отправлено: iukash от Январь 25, 2011, 21:38 Зачем тебе слот? Обрабатывай нажатие прямо в contextMenuEvent. Напишите как? Например хочу создать экземпляр класса и нарисовать его на сцену? И как без слота определить какой QAction подал сигнал?Цитировать Если нужны слоты, то наследуйся от QGraphicsObject Завтра попробую! Спасибо!Название: Re: Контекстное меню QGraphicsItem Отправлено: alexman от Январь 25, 2011, 21:40 И как без слота определить какой QAction подал сигнал? Код: void CustomItem::contextMenuEvent(QGraph icsSceneContextMenuEvent *event) Название: Re: Контекстное меню QGraphicsItem Отправлено: iukash от Январь 25, 2011, 21:51 И как без слота определить какой QAction подал сигнал? Код: void CustomItem::contextMenuEvent(QGraph icsSceneContextMenuEvent *event) Название: Re: Контекстное меню QGraphicsItem Отправлено: iukash от Январь 26, 2011, 10:31 Если нужны слоты, то наследуйся от QGraphicsObject Наследуюсь от QGraphicsObject, делаю все также со слотом пишет Код: Object::connect: No such slot QGraphicsObject::slotmessage() in graphika_rect.cpp:30 А как посоветовал alexman не использовать слоты, так работает, спасибо! Название: Re: Контекстное меню QGraphicsItem Отправлено: BRE от Январь 26, 2011, 10:33 Ты в свой класс Q_OBJECT добавил?
qmake вызывал после изменения класса? Название: Re: Контекстное меню QGraphicsItem Отправлено: iukash от Январь 26, 2011, 10:45 Ты в свой класс Q_OBJECT добавил? qmake вызывал после изменения класса? Теперь сделал, это сообщение Цитировать Object::connect: No such slot QGraphicsObject::slotmessage() in graphika_rect.cpp:30 в консоль не выводится, но в слот он не попадает.Хотя это уже не важно, главное что работает! Всем спасибо! Название: Re: Контекстное меню QGraphicsItem Отправлено: pastor от Январь 26, 2011, 16:45 Давай сюда код *.h файла и код коннекта.
В первом посте у тебя slot_message, тут уже slotmessage. Название: Re: Контекстное меню QGraphicsItem Отправлено: iukash от Январь 26, 2011, 17:46 Код .h
Цитировать #ifndef GRAPHIKA_RECT_H код коннекта#define GRAPHIKA_RECT_H #include "mainwindow.h" class Graphika_rect: public QGraphicsObject { Q_OBJECT public: Graphika_rect(); virtual QRectF boundingRect() const { return QRectF(0,0,1000,740); } virtual void keyPressEvent ( QKeyEvent * event ); virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0); protected: virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); // virtual void mousePressEvent ( QGraphicsSceneMouseEvent * event ); // virtual void mouseReleaseEvent ( QGraphicsSceneMouseEvent * event ); // virtual void dragEnterEvent ( QGraphicsSceneDragDropEvent * event ); // virtual void dragLeaveEvent ( QGraphicsSceneDragDropEvent * event ); // virtual void dragMoveEvent ( QGraphicsSceneDragDropEvent * event ); // virtual void dropEvent ( QGraphicsSceneDragDropEvent * event ); // virtual void hoverEnterEvent ( QGraphicsSceneHoverEvent * event ); // virtual void hoverLeaveEvent ( QGraphicsSceneHoverEvent * event ); // virtual void mouseDoubleClickEvent ( QGraphicsSceneMouseEvent * event ); // virtual void mouseMoveEvent ( QGraphicsSceneMouseEvent * event ); }; #endif // GRAPHIKA_RECT_H Цитировать void Graphika_rect::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { QMenu menu; QAction *removeAction = menu.addAction(tr("Создать итем")); QAction *markAction = menu.addAction(tr("Для сцены 2")); QAction *selectedAction = menu.exec(event->screenPos()); connect(&menu,SIGNAL(triggered(QAction*)),SLOT(slotmessage())); } void Graphika_rect::slotmessage() { QMessageBox::warning(0,tr("Предупреждение"),tr("Нажата кнопка")); } Название: Re: Контекстное меню QGraphicsItem Отправлено: alexman от Январь 26, 2011, 17:52 Так slotmessage() в Graphika_rect не объявлен!
Название: Re: Контекстное меню QGraphicsItem Отправлено: pastor от Январь 26, 2011, 18:11 И коннект не в том месте:
Код
Название: Re: Контекстное меню QGraphicsItem Отправлено: alexman от Январь 26, 2011, 21:54 Дааа, одни приколы!
Название: Re: Контекстное меню QGraphicsItem Отправлено: iukash от Январь 26, 2011, 22:21 Цитировать Так slotmessage() в Graphika_rect не объявлен! Да был он объявлен, просто потом удалил, и при восстановлении забыл вставить! А вот то что коннект не в том месте это очень даже может быть! Название: Re: Контекстное меню QGraphicsItem Отправлено: pastor от Январь 27, 2011, 00:30 > Да был он объявлен, просто потом удалил, и при восстановлении забыл вставить!
И как он был объявлен? Название: Re: Контекстное меню QGraphicsItem Отправлено: iukash от Январь 27, 2011, 16:43 > Да был он объявлен, просто потом удалил, и при восстановлении забыл вставить! ТакИ как он был объявлен? Цитировать public slots: void slotmessage(); |