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.
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.