2015-05-08 265 views
-1

我創建了一個應用程序,該應用程序利用三個不同類的對象。基本上我有第一類「所有接口和主代碼」,第二類是簡單的矩形對象,最後一個是不同矩形之間的邊緣(或多或少與在elasticnode示例中一樣)。基本上每當用戶移動矩形邊緣被修改,我需要將「長度」種子到主類。在類之間共享變量QT

這裏是運動的代碼:

void Edge::adjust() 
{ 

QLineF line(mapFromItem(source, 0, 0), mapFromItem(dest, 0, 0)); 

prepareGeometryChange(); 

QPointF edgeOffset(5, 5); 
sourcePoint = line.p1() + edgeOffset; 
destPoint = line.p2() + edgeOffset; 

length_reff = sqrt((source->x()-dest->x())*(source->x()-dest->x())+(source->y()-dest->y())*(source->y()-dest->y())); 

emit length_COMPUTED(length_reff); 
//Here I have to send the lenght_ref variable to the MainWindow class 
} 

我試圖實現這種方式的信號/槽:

Edge.h:

public: 
Edge(MyItem *sourceNode, MyItem *destNode); 

void adjust(); 

signals: 
void length_COMPUTED(qreal &length_reff); 

MainWindow.h:

class MainWindow: public QMainWindow 
{ 
Q_OBJECT 

public: 
explicit MainWindow(QWidget *parent = 0); 
~MainWindow(); 
... 
public slots: 
void official_length_computation(); 
... 

in Main window.cpp:

this->connect(this, SIGNAL(length_COMPUTED(&length_reff)), this, SLOT(official_length_computation())); 

我想我完全錯了連接功能。

任何幫助?

感謝

Edge.cpp

Edge::Edge(MyItem *sourceNode, MyItem *destNode) : arrowSize(10) 
{ 
    setAcceptedMouseButtons(0); 
    source = sourceNode; 
    dest = destNode; 
    source->addEdge(this); 
    dest->addEdge(this); 


    adjust(); 
} 

void Edge::adjust() 
{ 
    QLineF line(mapFromItem(source, 0, 0), mapFromItem(dest, 0, 0)); 

    prepareGeometryChange(); 

    QPointF edgeOffset(5, 5); 
    sourcePoint = line.p1() + edgeOffset; 
    destPoint = line.p2() + edgeOffset; 


    length_reff = sqrt((source->x()-dest->x())*(source->x()-dest->x())+(source->y()-dest->y())*(source->y()-dest->y())); 

    emit length_COMPUTED(length_reff); 



} 

連接聲明:

test1 = new MyItem(); 
test2 = new MyItem(); 
Edge *myEdge = new Edge(test1,test2); 
this->connect(myEdge, SIGNAL(length_COMPUTED(qreal)), this, SLOT(official_length_computation(qreal))); 
+0

你在哪裏調用'Edge :: adjust()'?如果它位於MainWindow類中,則只需從調整函數返回一個值,即:返回length_reff;返回length_reff;返回length_reff;返回length_reff;返回length_reff;返回length_ref; }' – Carlton

+0

問題是Edge :: adjust()函數不在MainWIndow類中。它是在第三類(節點,如果你看看elasticnode的例子) – Thomas

+0

啊,那麼我認爲信號/插槽是要走的路。如果你這樣做了,並且不起作用,那麼也要發佈該代碼。 – Carlton

回答

2

這個 - >連接(這一點,SIGNAL(length_COMPUTED(& length_reff)),這, SLOT(official_length_computation()));

粗體是錯誤的部分。必須是:... SIGNAL(length_COMPUTED(QREAL &)...

,最有可能你想在你的插槽中的變量...所以:

這個 - >連接(這一點, SIGNAL(length_COMPUTED(QREAL &)),對此, SLOT(official_length_computation(QREAL &)));

但是,你也必須將這個變量添加到official_length_computation中。

好吧,不知道你是否縮短了你的代碼。但是當Edge應該發出信號時,它必須是QObject並使用Q_OBJECT宏。

變化Edge.h這樣:

class Edge: public QObject { 
Q_OBJECT 

..並相應地調整它的構造函數

+0

評論不適用於擴展討論;這個對話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/77354/discussion-on-answer-by-greenflow-share-variable-between-classes-qt)。 –