在QT中从main.cpp访问ui.label

时间:2016-01-18 10:18:42

标签: qt

我正在尝试从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中提供,任何建议都非常值得赞赏。

提前致谢。

1 个答案:

答案 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元素。