Search code examples
c++qtuser-interfacesignals-slots

mainwindow receives data from another class, but ui doesn't update


I get an examle of tcp server from here: http://www.voidrealms.com/index.php?r=tutorial/view&id=256 and was trying to add gui.

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_actionStart_Server_triggered();

public slots:
    void on_UpdateDevicesList(const QStringList &);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

"mainwindow.cpp"

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myserver.h"
#include "myclient.h"

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

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

void MainWindow::on_actionStart_Server_triggered()
{
    MyServer *Server = new MyServer();
    Server->StartServer();
}

void MainWindow::on_UpdateDevicesList(const QStringList &data){
    for (int i = 0; i < data.count(); ++i){
        qDebug() << data[i];
        ui->tableWidget->setItem(0, i, new QTableWidgetItem(data[i]));
    }
    qDebug() << "end";
}

myserver.h:

#ifndef MYSERVER_H
#define MYSERVER_H

#include <QTcpServer>
#include <QTcpSocket>
#include <QAbstractSocket>
#include "myclient.h"
#include "mainwindow.h"

class MyServer : public QTcpServer
{
    Q_OBJECT
public:
    explicit MyServer(QObject *parent = 0);
    void StartServer();
protected:
    void incomingConnection(int handle);
private:
    MainWindow *mainwindow;
};

#endif // MYSERVER_H

myserver.cpp:

#include "myserver.h"

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

void MyServer::StartServer()
{
    if(listen(QHostAddress::Any,1234))
    {
        qDebug() << "started";
    }
    else
    {
        qDebug() << "not started!";
    }
}

void MyServer::incomingConnection(int handle)
{
    qDebug() << "new connection";
    MyClient *client = new MyClient();
    mainwindow = new MainWindow();
    connect(client, &MyClient::UpdateDevicesList, mainwindow, &MainWindow::on_UpdateDevicesList);
    client->SetSocket(handle);
}

myclient.h:

#ifndef MYCLIENT_H
#define MYCLIENT_H

#include <QObject>
#include <QTcpSocket>
#include <QDebug>
#include <QThreadPool>
#include "mytask.h"
#include "mainwindow.h"

class MyClient : public QObject
{
    Q_OBJECT
public:
    explicit MyClient(QObject *parent = 0);
    void SetSocket(int Descriptor);

signals:
    void UpdateDevicesList(const QStringList &);

public slots:
    void connected();
    void disconnected();
    void readyRead();
    void TaskResult(int Number);

private:
    QTcpSocket *socket;

};

#endif // MYCLIENT_H

myclient.cpp:

#include "myclient.h"


MyClient::MyClient(QObject *parent) :
    QObject(parent)
{
    QThreadPool::globalInstance()->setMaxThreadCount(15);
}

void MyClient::SetSocket(int Descriptor)
{
    socket = new QTcpSocket(this);

    connect(socket,SIGNAL(connected()),this,SLOT(connected()));
    connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected()));
    connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()));

    socket->setSocketDescriptor(Descriptor);

    qDebug() << "client connected";

    QStringList fields;
    fields << "0"
           << "test"
           << "ip"
           << QString::number(Descriptor)
           << "connected";

    emit UpdateDevicesList(fields);
}

So, on new client connection

emit UpdateDevicesList(fields);

sent QStringList fields to

void MainWindow::on_UpdateDevicesList(const QStringList &data){
    for (int i = 0; i < data.count(); ++i){
        qDebug() << data[i];
        ui->tableWidget->setItem(0, i, new QTableWidgetItem(data[i]));
    }
    qDebug() << "end";
}

qDebug()show them, but on some reason tableWidget not set.


Solution

  • When using QTableWidget you have to specify rows and cols count using setRowCount and setColumnCount methods.

    Besides, you should avoid to use QTableWidget, and use QTableView instead.