QGraphicsPixmapItem,连接到插槽的替代方法

时间:2013-02-05 12:23:16

标签: qt

我知道如果我使用的是QGraphicsPixmapItem,我需要从QObject派生才能连接到插槽,但我很难做到这一点。我已经尝试了其他方法来实现我想要的东西,我尝试过onMousePress并且是可选择的,即

run->setFlag(QGraphicsPixmapItem::ItemIsSelectable);

if (run->isSelected())
{
    qDebug() << "selected";
}
else if (!run->isSelected())
{
    qDebug() << "not selected";
}

虽然run是可选的,但第一个参数永远不会成立,它始终是“未选中”

这是我的代码,我正在研究插槽方法;

mainwindow.cpp

int MainWindow::sim()
{

...
    QGraphicsPixmapItem* run = new QGraphicsPixmapItem(QPixmap::fromImage(image6));
    run->scale(0.3,0.3);
    run->setPos(-200,-200);
    run->setFlag(QGraphicsPixmapItem::ItemIsSelectable);
    run->setCursor(Qt::PointingHandCursor);
    connect(run, SIGNAL(selectionChanged()), this, SLOT(runClicked()));
    scene->addItem(run);

    //pause 
    QGraphicsPixmapItem* pause = new QGraphicsPixmapItem(QPixmap::fromImage(image7));
    pause->scale(0.3,0.3);
    pause->setPos(-160,-197);
    pause->setFlag(QGraphicsPixmapItem::ItemIsSelectable);
    pause->setCursor(Qt::PointingHandCursor);
    connect(pause, SIGNAL(selectionChanged()), this, SLOT(pauseClicked()));
    scene->addItem(pause);
...

}

void MainWindow::runClicked()
{
    qDebug() << "run Clicked";
}

void MainWindow::pauseClicked()
{
    qDebug() << "pause Clicked";
}

mainwindow.h

#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();
    int sim();
...

public slots:
    void runClicked();
    void pauseClicked();
...

很明显,连接到插槽时出现错误。有人可以帮忙吗?谢谢。

2 个答案:

答案 0 :(得分:2)

要确定您的项目是否已被选中,请执行以下操作:

QVariant MyItem::itemChange( GraphicsItemChange change, const QVariant& value )
{
    if ( change == QGraphicsItem::ItemSelectedHasChanged ) {
        qDebug() << ( isSelected() ? "selected" : "not selected" );
    }

    return QGraphicsItem::itemChange( change, value );
}

答案 1 :(得分:1)

如果要使用信号和插槽,则需要将QObjectQGraphicsPixmapItem子类化。

由于QObject不包含clicked()信号,您需要通过重新实施来实现 void mousePressEvent ( QGraphicsSceneMouseEvent *e )void mouseReleaseEvent ( QGraphicsSceneMouseEvent *e )

MyItem:

#pragma once

#include <QGraphicsPixmapItem>
#include <qobject.h>
#include <QMouseEvent>
#include <QGraphicsSceneMouseEvent>

class MyItem:  public QObject, public QGraphicsPixmapItem 
               /* moc.exe requires to derive from QObject first! */
{
    Q_OBJECT
public:
    MyItem(QGraphicsItem *parent = 0): QObject(), QGraphicsPixmapItem(parent)
    {

    }

    MyItem(const QPixmap & pixmap, QGraphicsItem * parent = 0 ): QObject(), 
                                                                 QGraphicsPixmapItem(pixmap, parent)
    {

    }

signals:
    void clicked();

protected:
    // re-implement processing of mouse events
    void mouseReleaseEvent ( QGraphicsSceneMouseEvent *e )
    {
        // check if cursor not moved since click beginning
        if ((m_mouseClick) && (e->pos() == m_lastPoint))
        {
            // do something: for example emit Click signal
            emit clicked();
        }
    }

    void mousePressEvent ( QGraphicsSceneMouseEvent *e )
    {
        // store click position
        m_lastPoint = e->pos();
        // set the flag meaning "click begin"
        m_mouseClick = true;
    }

private:
    bool m_mouseClick;
    QPointF m_lastPoint;
};

简单的使用示例:

#include <qgraphicsview.h>
#include <qgraphicsscene.h>
#include "reader.h"
#include <qdebug.h>
class MainAppClass: public QObject
{
    Q_OBJECT
public:
    MainAppClass()
    {
         QGraphicsScene *scene = new QGraphicsScene();;
         scene->setSceneRect( -100.0, -100.0, 200.0, 200.0 );

         MyItem *item = new MyItem(QPixmap("about.png"));
         connect(item, SIGNAL(clicked()), this, SLOT(pixmapClicked()));
         scene->addItem(item);

         QGraphicsView * view =  new QGraphicsView( scene );
         view->setRenderHints( QPainter::Antialiasing );
         view->show();
    }

public slots:
    void pixmapClicked()
    {
        qDebug() << "item clicked!" ;
    }
};