Сигнал излучается, соединение возвращает истину, слот не запускается - PullRequest
0 голосов
/ 05 мая 2020

Это второй способ, которым я это переставил, и он делает то же самое, поэтому теперь я обращаюсь за помощью. Ошибок не выкидывает, просто слот ничего не делает. Есть два других соединения, которые работают между теми же двумя cpps, и я решил добавить это третье соединение, которое запускает главное окно, в главное окно.

on_line_edit_returnPressed(), печатает hol_num и это там, где это заканчивается. ReadyHollander излучает, а HolPub никогда ничего не делает. Что я делаю не так?

mainwindow cpp

#include "wheelscannerui.h"
#include "./ui_wheelscannerui.h"

gui_image_node *m_gui_image_node;
WheelScannerUI::WheelScannerUI(QWidget *parent)
    : QMainWindow(parent),
    ui(new Ui::WheelScannerUI)

{
    ui->setupUi(this);
    connect(m_gui_image_node, &gui_image_node::ReadyImage, this, &WheelScannerUI::updateWheelImage);
    connect(m_gui_image_node, &gui_image_node::OpenHollander, this, &WheelScannerUI::Open_No_ID);
    connect(this, &WheelScannerUI::ReadyHollander, m_gui_image_node, &gui_image_node::HolPub);
    qDebug() << connect(this, &WheelScannerUI::ReadyHollander, m_gui_image_node, &gui_image_node::HolPub);
    ui->lineEdit->setVisible(false);
    QMainWindow::showFullScreen();
}

WheelScannerUI::~WheelScannerUI()
{
    delete ui;
}

void WheelScannerUI::Open_No_ID(QString qsteve)
{
    ui->lineEdit->setVisible(true);
}

void WheelScannerUI::on_lineEdit_returnPressed()
{
    QString hol_num = ui->lineEdit->text();
    Q_EMIT ReadyHollander(hol_num);
    ui->lineEdit->setVisible(false);
    ui->lineEdit->clear();
    qDebug() << hol_num;
}

main windows .h

#ifndef WHEELSCANNERUI_H
#define WHEELSCANNERUI_H

#include <QMainWindow>
#include <QtSql>
#include <QSqlQuery>
#include <QSqlDatabase>
#include <QSqlQueryModel>

#include "gui_image_node.h"
#include <QPixmap>

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <std_msgs/Int64.h>
#include <sensor_msgs/image_encodings.h>
#include <nodelet/nodelet.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/highgui/highgui.hpp>
#include <pluginlib/class_list_macros.h>
#include <stdio.h>
#include <string.h>
#include <sstream>
#include <iostream>
extern gui_image_node *m_gui_image_node;
QT_BEGIN_NAMESPACE
namespace Ui { class WheelScannerUI; }
QT_END_NAMESPACE

class WheelScannerUI : public QMainWindow
{
    Q_OBJECT

public:
    WheelScannerUI(QWidget *parent = nullptr);
    ~WheelScannerUI();
    WheelScannerUI *m_WheelScannerUI;
    void connectionClose()
    {
        db.close();
        db.removeDatabase(QSqlDatabase::defaultConnection);
    }
    bool connectionOpen()
    {
        db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("~/wheels.db");

        if(!db.open())
        {
            qDebug()<<("Database failed to open");
            return false;
        }
        else{
            qDebug()<<("database connected");
            return true;
        }
    }
public slots:
    Q_SLOT void Open_No_ID(QString qsteve);

    Q_SLOT void open_db_table(); //trigger with a ros callback?

signals:
    Q_SIGNAL void ReadyHollander(QString);
private slots:

    void on_lineEdit_returnPressed();

    void on_Mode_Button_clicked();

private:
    Ui::WheelScannerUI *ui;
    QSqlDatabase db;



};
#endif // WHEELSCANNERUI_H

node cpp


#include "gui_image_node.h"
gui_image_node::gui_image_node()
{

}

bool gui_image_node::init(int argc, char** argv)
{
    m_pThread = new QThread();

    this->moveToThread(m_pThread);

    connect(m_pThread, &QThread::started, this, &gui_image_node::run);

    ros::init(argc, argv, "wheels_gui_image");

    if ( ! ros::master::check() )
    {
        return false;
    }

    ros::start();
    ros::Time::init();
    ros::NodeHandle nh;

    hollander_pub = nh.advertise<std_msgs::String>("/hollander_chat", 1);
    hol_trigger = nh.subscribe("awaiting_hollander", 1, &gui_image_node::Hollander_Screen_trigger_callback, this);

    m_pThread->start();
    return true;
}


void gui_image_node::Hollander_Screen_trigger_callback(const std_msgs::String::ConstPtr& msg)
{
    std::string steve = msg->data; 
    QString qsteve = QString::fromStdString(steve);
    Q_EMIT OpenHollander(qsteve);
}
void gui_image_node::HolPub(QString hol_num)
{
    qDebug() << "received number";
    std::string hol_num_conv = hol_num.toUtf8().constData();
    std_msgs::String msg;
    msg.data = hol_num_conv;
    hollander_pub.publish(msg);
}

узлов .h

#ifndef GUI_IMAGE_NODE_H
#define GUI_IMAGE_NODE_H

#include <ros/ros.h>
#include <nodelet/nodelet.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/highgui/highgui.hpp>
#include <std_msgs/String.h>

#include <QMainWindow>
#include <QObject>
#include <QSharedDataPointer>
#include <QWidget>
#include <QThread>
#include <string>
#include <QMutex>
#include <QDebug>

#include <QDialog>
#include <stdio.h>
#include <string.h>
#include <sstream>
#include <iostream>

class gui_image_node : public QThread
{
    Q_OBJECT
public:
    gui_image_node();
    ~gui_image_node();
    bool init(int argc, char** argv);
    void Hollander_Screen_trigger_callback(const std_msgs::String::ConstPtr& msg);

protected:
public slots:
    Q_SLOT void run();
    Q_SLOT void HolPub(QString hol_num);
signals:
    Q_SIGNAL void OpenHollander(QString);

private:
    ros::Publisher hollander_pub;
    ros::Subscriber hol_trigger;
    QThread * m_pThread;

};

#endif // GUI_IMAGE_NODE_H

1 Ответ

0 голосов
/ 05 мая 2020

Хорошо, я понял это, connect(this, &WheelScannerUI::ReadyHollander, m_gui_image_node, &gui_image_node::HolPub, Qt::Directconnection);

Поскольку это запускается из другого потока, Directconnection позволяет потоку, из которого он создается, запускать слот в другом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...