简体   繁体   中英

QT change GUI with SIGNAL and SLOT

I hava a question for developing QT Application. I want to change GUI using SINGAL and SLOT. sendValue() from mythread.cpp to showValue() from myserver.cpp is good working. That connected very well and I can check the value.

But sendApp() from myserver.cpp to showApp() from application.cpp is not working. I'm confusing that not connection or no emit or other problem. There is two question. One is how to connect from sendApp() to showApp() using SIGNAL and SLOT. emit is not work? or connection is not work? I can't find cause. The other is is that possible if showApp() function work? Please Answer me. I am so sorry this is my first time to develop QT application.

application.h

#ifndef APPLICATION_H
#define APPLICATION_H

#include <QWidget>
#include <QObject>
#include <menu.h>
#include <QTcpServer>
#include "myserver.h"
#include "mythread.h"

QT_BEGIN_NAMESPACE
namespace Ui { class application; }
QT_END_NAMESPACE

class application : public QWidget
{
    Q_OBJECT

public:
    application(QWidget *parent = nullptr);
    ~application();

private slots:
    void on_menuBt_clicked();
    void menuBackBtClicked();
    void showApp(QString strValue);

private:
    Ui::application *ui;
    menu menuPage;

};

#endif // APPLICATION_H

application.cpp

#include "application.h"
#include "ui_application.h"
#include "myserver.h"
#include "mythread.h"

application::application(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::application)
{
    ui->setupUi(this);

    Myserver *myserver = new Myserver(this);


    ui->firstToggle->setVisible(false);
    ui->secondToggle->setVisible(false);
    ui->thirdToggle->setVisible(false);
    ui->forthToggle->setVisible(false);
    ui->stackedWidget->addWidget(&menuPage);

    ui->stackedWidget->insertWidget(1, &menuPage);

    connect(&menuPage, SIGNAL(menuBackClick()), this, SLOT(menuBackBtClicked()));
    connect(myserver, SIGNAL(sendApp(QString)), this, SLOT(showApp(QString)));

    setWindowFlags(Qt::FramelessWindowHint);

}

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


void application::on_menuBt_clicked()
{
    ui->stackedWidget->setCurrentIndex(1); //menuLayout
}

void application::menuBackBtClicked()
{
    ui->stackedWidget->setCurrentIndex(0);
}

void application::showApp(QString strValue) {
    QString compare = "13";
    int x = QString::compare(strValue,compare, Qt::CaseInsensitive);
    if(x == 0) {
        ui->firstToggle->setVisible(true);
    }
}

myserver.h

#ifndef MYSERVER_H
#define MYSERVER_H

#include <QObject>
#include <QTcpServer>
#include "mythread.h"
#include "application.h"

class Myserver : public QTcpServer
{
    Q_OBJECT

public:
    explicit Myserver(QObject *parent = 0);
    void startServer();
signals:
    void sendApp(QString strValue);

private slots:
    void showValue(QString strValue);

protected:
    void incomingConnection(qintptr socketDescriptor);

private:
    MyThread *mythread;


};

#endif // MYSERVER_H

myserver.cpp

#include "myserver.h"
#include "mythread.h"
#include "application.h"

Myserver::Myserver(QObject *parent) :
    QTcpServer(parent)
{
}

void Myserver::startServer()
{
    int port = 3333;

    if(!this->listen(QHostAddress::Any,port))
    {
        qDebug() << "Could not start server";
    }
    else
    {
        qDebug() << "Listening to port " << port << "...";
    }
}

void Myserver::incomingConnection(qintptr socketDescriptor)
{
    // We have a new connection
    qDebug() << socketDescriptor << " Connecting...";

    MyThread *thread = new MyThread(socketDescriptor, this);

    // connect signal/slot
    // once a thread is not needed, it will be beleted later
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    connect(thread, SIGNAL(sendValue(QString)), this, SLOT(showValue(QString)));

    thread->start();
}
void Myserver::showValue(QString strValue){
    emit sendApp(strValue);
}

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QTcpSocket>
#include <QThread>
#include <QDebug>

class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(qintptr ID, QObject *parent = 0);
    void run();

signals:
    void error(QTcpSocket::SocketError socketerror);
    void sendValue(QString strValue);

private slots:
    void readyRead();
    void disconnected();

private:
    QTcpSocket *socket;
    qintptr socketDescriptor;

};

#endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"

#include <QThread>

MyThread::MyThread(qintptr ID, QObject *parent) :
    QThread(parent)
{
    this->socketDescriptor = ID;
}

int count = 0;

void MyThread::run()
{
    // thread starts here
    qDebug() << " Thread started";

    socket = new QTcpSocket();

    // set the ID
    if(!socket->setSocketDescriptor(this->socketDescriptor))
    {
        // something's wrong, we just emit a signal
        emit error(socket->error());
        return;
    }

    // connect socket and signal
    // note - Qt::DirectConnection is used because it's multithreaded
    //        This makes the slot to be invoked immediately, when the signal is emitted.

    connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()), Qt::DirectConnection);
    connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));

    // We'll have multiple clients, we want to know which is which
    qDebug() << socketDescriptor << "Client connected";

    QString strValue = QString::number(socketDescriptor);

    emit sendValue(strValue);

    // make this thread a loop,
    // thread will stay alive so that signal/slot to function properly
    // not dropped out in the middle when thread dies

    exec();
}

void MyThread::readyRead()
{
    // get the information
    QByteArray Data = socket->readAll();

    // will write on server side window
    qDebug() << socketDescriptor << " Data in: " << Data;

    socket->write(Data);
}

void MyThread::disconnected()
{
    qDebug() << socketDescriptor << " Disconnected";

    socket->deleteLater();
    exit(0);
}

You just forgot to start your server!

It might work just by adding startServer() function call after your connections in application class constructor .

connect(&menuPage, SIGNAL(menuBackClick()), this, SLOT(menuBackBtClicked()));
connect(myserver, SIGNAL(sendApp(QString)), this, SLOT(showApp(QString)));

myserver->startServer();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM