2016-01-18 15 views
0

我正在嘗試從arduino發佈並訂閱我在QT中創建的GUI的反饋數據。訪問來自QT的main.cpp的ui.label

現在我有main.cpp和mainwindow.cpp。

的main.cpp

#include <QtGui> 
#include <ros/ros.h> 
#include <QApplication> 
#include "../include/abc/main_window.hpp" 
#include "std_msgs/String.h" 
#include <std_msgs/UInt16.h> 
#include <QMainWindow> 
#include <std_msgs/Float32.h> 

void chatterCallback(const std_msgs::UInt16 &fb_msg){ 
    ROS_INFO("Feedback: [%f]", fb_msg.data); 
    ui.label_6->setText(QString("%1").arg(fb_msg.data)); 
} 
int main(int argc, char **argv) { 
ros::init(argc, argv, "talker"); 
ros::NodeHandle n; 
ros::Subscriber sub = n.subscribe("feedback",1000, chatterCallback); 
ros::spinOnce(); 
QApplication app(argc, argv); 
abc::MainWindow w(argc,argv); 
w.show(); 
w.setWindowTitle("GUI for Controlling Servo Motor"); 
app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit())); 
int result = app.exec(); 
return result;} 

mainwindow.cpp

namespace abc { 

using namespace Qt; 
QSerialPort *serial; 

MainWindow::MainWindow(int argc, char** argv, QWidget *parent) 
: QMainWindow(parent) 
, qnode(argc,argv) 
{ 
ui.setupUi(this); 
} 
MainWindow::~MainWindow() {} 
void MainWindow::on_horizontalSlider_valueChanged(int value) 
{ 
ui.label_5->setText(QString("%1").arg(value)); 
msg.data = ui.label_5->text().toUInt(); 
ROS_INFO("%d", msg.data); 
chatter_pub.publish(msg); 
ros::spinOnce(); 
} 

main_window.hpp

#ifndef abc_MAIN_WINDOW_H 
#define abc_MAIN_WINDOW_H 
#include <QtGui/QMainWindow> 
#include "ui_main_window.h" 
#include "qnode.hpp" 
#include <QtSerialPort/QSerialPort> 
#include <ros/ros.h> 
#include "std_msgs/UInt16.h" 

namespace abc { 

class MainWindow : public QMainWindow { 
Q_OBJECT 

public: 
MainWindow(int argc, char** argv, QWidget *parent = 0); 
~MainWindow(); 

public Q_SLOTS: 

private: 

Ui::MainWindowDesign ui; 
ros::NodeHandle n; 
ros::Publisher chatter_pub = n.advertise <std_msgs::UInt16> ("chatter", 1000); 
QSerialPort *arduino; 
QNode qnode; 
}; 

} // namespace abc 

#endif // abc_MAIN_WINDOW_H 

現在,當我運行這段代碼,它表明我,UI不聲明main.cpp中。

我想顯示反饋到label_6(TextBox)的數據。數據僅在main.cpp中可用,任何建議都非常可觀。

在此先感謝。

+0

問題:1.從哪裏得到這個反饋值? 2.我猜測用戶界面有一個label_6,可以像訪問label_5一樣從mainWindow.cpp訪問,是嗎? – sami1592

+0

反饋來自Arduino,準確收到。 –

回答

0

您必須將fb_msg.data作爲參數傳遞給MainWindow構造函數。然後,您可以在MainWindow線程中設置UI元素。 或者,您可以在main中創建MainWindow實例,然後發出在MainWindow線程中捕獲並處理的信號。

您無法從其他線程修改UI元素。