1

我想做的很简单,当鼠标悬停在 qgraphicsitem 上时,我希望它改变它的文本值。稍后我想在单击图像时使用它来弹出文本(即图像的信息)

到目前为止,这是我的代码:

#include <QtGui/QApplication>
#include <QtGui/QGraphicsItem>
#include <QtGui/QGraphicsTextItem>
#include <QtGui/QGraphicsScene>
#include <QtGui/QGraphicsView>
#include <QtGui/QPixmap>

int main( int argc, char * * argv )
{
    QApplication      app( argc, argv );
    QGraphicsScene    scene;
    QGraphicsView     view( &scene );

    QGraphicsTextItem text( "this is my text");
    scene.addItem(&text);
    scene.setActivePanel(&text);
    text.setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
    text.setAcceptHoverEvents(true);
    text.setAcceptTouchEvents(true);
    if (text.isUnderMouse() || text.isSelected()){
        text.setPlainText("test");
    }
    view.show();

    return( app.exec() );
}

有些人使用双击事件,但我希望不使用它们,但是......如果这是完成工作的唯一方法,那么没关系。

4

1 回答 1

0

此代码块:

if (text.isUnderMouse() || text.isSelected()){
    text.setPlainText("test");
}

在您的视图显示之前只运行一次;所以这绝对没有机会做你期望的事情。

您需要为此做更多的工作,即创建一个自定义子类QGraphicsTextItem并覆盖适当的事件处理程序。

以下是在悬停时处理更改文本的方法:

class MyTextItem: public QGraphicsTextItem
{
    public:
        MyTextItem(QString const& normal, QString const& hover,
                   QGraphicsItem *parent=0)
            : QGraphicsTextItem(normal, parent), normal(normal), hover(hover)
        {
        }

    protected:
        void hoverEnterEvent(QGraphicsSceneHoverEvent *)
        {
            setPlainText(hover);
        }
        void hoverLeaveEvent(QGraphicsSceneHoverEvent *)
        {
            setPlainText(normal);
        }
    private:
        QString normal, hover;

};

将其添加到您的代码中,并将text声明更改为:

MyTextItem text("this is my text", "test");

它应该做你所期望的。

于 2012-04-29T15:35:32.153 回答