Russian Qt Forum

Qt => Общие вопросы => Тема начата: iukash от Январь 25, 2011, 12:14



Название: Контекстное меню 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()) );
что за пробел?
это просто при переносе на форум ошибся
Цитировать
Посмотри повнимательнее чего то не хватает
можно или так :
QObject::connect(pSender,SIGNAL(signal()),pReceiver,SLOT(slot());
или так:
pReceiver->connect(pSender,SIGNAL(signal()),SLOT(slot());

Оба варианта эквивалентны.
А как сделать так pReceiver это был как раз CustomItem, а слот - это его слот?
Цитировать
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()) );
Делал так, тогда все компилится, запускается, но при попытке нажать на кнопку в консоль выходит сообщение типа slot_message() не является слотом QMenu.


Название: 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)
{
QMenu menu;
QAction *removeAction = menu.addAction("Remove");
QAction *markAction = menu.addAction("Mark");
QAction *selectedAction = menu.exec(event->screenPos());
if ( selectedAction == removeAction ) { //...
} else if ( selectedAction == markAction ) { //...
}
}


Название: Re: Контекстное меню QGraphicsItem
Отправлено: iukash от Январь 25, 2011, 21:51
И как без слота определить какой QAction подал сигнал?
Код:
void CustomItem::contextMenuEvent(QGraph icsSceneContextMenuEvent *event)
{
QMenu menu;
QAction *removeAction = menu.addAction("Remove");
QAction *markAction = menu.addAction("Mark");
QAction *selectedAction = menu.exec(event->screenPos());
if ( selectedAction == removeAction ) { //...
} else if ( selectedAction == markAction ) { //...
}
}
Спасибо и Вам тоже! Завтра буду пробывать!


Название: Re: Контекстное меню QGraphicsItem
Отправлено: iukash от Январь 26, 2011, 10:31
Если нужны слоты, то наследуйся от QGraphicsObject

Наследуюсь от QGraphicsObject, делаю все также со слотом пишет
Код:
Object::connect: No such slot QGraphicsObject::slotmessage() in graphika_rect.cpp:30
Хотя слот этот видит (когда пишу SLOT при открытии скобки автодополнение кода пишет slotmessage())

А как посоветовал 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
И коннект не в том месте:

Код
C++ (Qt)
void Graphika_rect::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
   QMenu menu;
   QAction *removeAction = menu.addAction(tr("Создать итем"));
   QAction *markAction = menu.addAction(tr("Для сцены 2"));
   connect(&menu,SIGNAL(triggered(QAction*)),SLOT(slotmessage()));
   menu.exec(event->screenPos());
}


Название: 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();