我正在尝试从arduino发布反馈数据并订阅我在QT中创建的GUI。
现在我有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 :(得分:0)
您必须将var $videoDialog = $("#videoDialog").dialog({
autoOpen: false,
width: 900,
height: "auto",
modal: true,
close: function() {
$videoDialog.remove();
}
}),
$iframeVideoPlayer = $("#videoPlayer");
$(".video").on("click", function(){
var videoSrc = $(this).data("src");
$videoDialog = $("#videoDialog");
if($videoDialog.length == 0){
//here appending dialog in body and .dialog it
$("body").append("<div id='videoDialog' title='Video Player'><iframe id='videoPlayer' src='"+videoSrc+"' width='100%' height='500' style='border: 0px;'></iframe></div>");
$videoDialog = $("#videoDialog").dialog({
autoOpen: false,
width: 900,
height: "auto",
modal: true,
close: function() {
$videoDialog.remove();
}
});
$iframeVideoPlayer = $("#videoPlayer");
}
$iframeVideoPlayer.prop("src", videoSrc);
$videoDialog.dialog("open");
});
作为参数传递给fb_msg.data
构造函数。然后,您可以在MainWindow
线程中设置UI元素。
或者,当您在main中创建MainWindow
实例时,您可以发出一个信号,您可以在MainWindow
线程中捕获并处理该信号。
您无法从其他线程修改UI元素。