2016-09-16 60 views
1

免責聲明,我只是今天剛剛下載Qt並沒有經驗。所以我很抱歉,如果這有點愚蠢。得從某處開始:)。我可以在QPolygon上使用SIGNAL/SLOT嗎?

我將使用[thing1]和[thing2],1是GraphicsWidget中的qpolygon,2是Widget。

[thing1] = scene->addPolygon([pathname],Pen,Brush) 
ui->[thing2]->hide(); 
connect([thing1],SIGNAL(hovered()),ui->[thing2],SLOT(show())); 

我試圖隱藏在鼠標懸停事件/節目,但我得到的錯誤

D:\Documents\Test\GUI\mainwindow.cpp:61: error: no matching function for call to 'MainWindow::connect(QGraphicsPolygonItem*&, const char*, MainWindow*, QTextEdit*&, const char*)' 
connect([thing1],SIGNAL(hovered()),this,ui->[thing2],SLOT(show())); 
                   ^
+3

如果您沒有經驗,請先閱讀文檔和教程。對於信號/插槽:類的文檔告訴你每個類有什麼信號/插槽。 QPolygon例如沒有信號叫做hovered()。但是,stackoverflow不會替代你的教程。你應該首先對事物有一些基本的瞭解。 – Hayt

+0

錯誤消息與您發佈的代碼不符。該錯誤是關於一個調用連接5個參數傳遞,您的代碼通過4. – Mat

+0

相關問題:http://stackoverflow.com/questions/2940392/qgraphicsitem-doesnt-receive-mouse-hover-events –

回答

0

NO!

僅供參考:信號和插槽可用於QPolygon的任何qt對象!

bool QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection) 

我們使用的連接實際上是QObject的連接::(常量的QObject * sender_object,爲const char *信號,常量QObject的 receiver_object,爲const char),所以它適用於每一個QObject中是否正在發送和接收。

對於你的情況,正如hayt的評論中提到的,QPolygon沒有懸停()信號,這就是爲什麼它不起作用。 你應該去qt官方網站的QPolygon文檔並閱讀它。

據我所知,有一個爲QPolygon沒有信號,因此它不能在信號和槽:)

0

並不總是使用。在Qt 5中,您當然可以將信號連接到「任何東西」,例如一個非qobject方法,或一個函子。但是你不能將任何信號連接到任何信號上,並且QGraphicsPolygonItem上沒有hovered信號,因爲它不是QObject,所以它不能有任何信號。

相反,您需要創建一個將QGraphicsSceneEvent轉換爲信號的過濾器對象。例如:

// https://github.com/KubaO/stackoverflown/tree/master/questions/polygon-sigslot-39528030 
#include <QtWidgets> 

class HoverFilter : public QGraphicsObject { 
    Q_OBJECT 
    bool sceneEventFilter(QGraphicsItem * watched, QEvent *event) override { 
     if (event->type() == QEvent::GraphicsSceneHoverEnter) 
      emit hoverEnter(watched); 
     else if (event->type() == QEvent::GraphicsSceneHoverLeave) 
      emit hoverLeave(watched); 
     return false; 
    } 
    QRectF boundingRect() const override { return QRectF{}; } 
    void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) override {} 
public: 
    Q_SIGNAL void hoverEnter(QGraphicsItem *); 
    Q_SIGNAL void hoverLeave(QGraphicsItem *); 
}; 

QPolygonF equilateralTriangle(qreal size) { 
    return QPolygonF{{{0.,0.}, {size/2., -size*sqrt(3.)/2.}, {size,0.}, {0.,0.}}}; 
} 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    QWidget ui; 
    QVBoxLayout layout{&ui}; 
    QGraphicsView view; 
    QLabel label{"Hovering"}; 
    layout.addWidget(&view); 
    layout.addWidget(&label); 
    label.hide(); 
    ui.show(); 

    QGraphicsScene scene; 
    view.setScene(&scene); 
    HoverFilter filter; 
    QGraphicsPolygonItem triangle{equilateralTriangle(100.)}; 
    scene.addItem(&filter); 
    scene.addItem(&triangle); 
    triangle.setAcceptHoverEvents(true); 
    triangle.installSceneEventFilter(&filter); 
    QObject::connect(&filter, &HoverFilter::hoverEnter, [&](QGraphicsItem * item) { 
     if (item == &triangle) label.show(); 
    }); 
    QObject::connect(&filter, &HoverFilter::hoverLeave, [&](QGraphicsItem * item) { 
     if (item == &triangle) label.hide(); 
    }); 
    return app.exec(); 
} 
#include "main.moc"