首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QGraphicsPixmapItem,连接到插槽的替代方法

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

Stack Overflow用户
提问于 2013-02-05 12:23:16
回答 2查看 1.4K关注 0票数 0

我知道,如果我使用QObject,我需要从QGraphicsPixmapItem派生,以便连接到一个插槽,但是我很难做到这一点。我尝试过其他方法来实现我想要的,我尝试了onMousePress和isSelectable。

run->setFlag(QGraphicsPixmapItem::ItemIsSelectable);if (run->isSelected()) { qDebug() << "selected";} << (!run->isSelected()) { qDebug() <<“未选中”;}

虽然run是可选的,但第一个参数永远不是真,它总是“未被选中”。

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

代码语言:javascript
复制
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();
...

所以很明显,当连接到插槽时,我会得到错误。有人能帮忙吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-05 13:22:34

如果您想使用信号和插槽,您需要同时对QObjectQGraphicsPixmapItem进行子类。

因为QObject不包含clicked()信号,所以您也需要通过重新实现来实现它。

void mousePressEvent ( QGraphicsSceneMouseEvent *e )void mouseReleaseEvent ( QGraphicsSceneMouseEvent *e ).

MyItem:

代码语言:javascript
复制
#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;
};

以及简单的用法示例:

代码语言:javascript
复制
#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!" ;
    }
};
票数 1
EN

Stack Overflow用户

发布于 2013-02-05 12:55:08

若要确定是否选择了项目,请执行以下操作:

代码语言:javascript
复制
QVariant MyItem::itemChange( GraphicsItemChange change, const QVariant& value )
{
    if ( change == QGraphicsItem::ItemSelectedHasChanged ) {
        qDebug() << ( isSelected() ? "selected" : "not selected" );
    }

    return QGraphicsItem::itemChange( change, value );
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14707478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档