0

QGraphicsPixmapItem を使用している場合、スロットに接続するために QObject から派生する必要があることは承知していますが、これを行うのに苦労しています。私が望むものを達成するための別の方法を試しました.onMousePressとisSelectableを試しました.

run->setFlag(QGraphicsPixmapItem::ItemIsSelectable);

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

run は選択可能ですが、最初の引数が true になることはなく、常に「選択されていません」

これは私のコードです。私はスロットメソッドに取り組んでいます。

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();
...

明らかに、スロットに接続するときにエラーが発生します。誰か助けてくれませんか?ありがとうございました。

4

2 に答える 2

2

アイテムが選択されているかどうかを確認するには、次の操作を行います。

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

    return QGraphicsItem::itemChange( change, value );
}
于 2013-02-05T12:55:08.970 に答える
1

QObjectシグナルとスロットを使用する場合は、 と の両方をサブクラス化する必要がありますQGraphicsPixmapItem

QObjectにはシグナルが含まれていないため、 andclicked()を再実装して、それも実装する必要があります。
void mousePressEvent ( QGraphicsSceneMouseEvent *e )void mouseReleaseEvent ( QGraphicsSceneMouseEvent *e )

マイアイテム:

#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!" ;
    }
};
于 2013-02-05T13:22:34.907 に答える