2015-05-08 151 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)。 –