【问题标题】:mainwindow receives data from another class, but ui doesn't update主窗口从另一个类接收数据,但 ui 不更新
【发布时间】:2017-03-14 05:49:13
【问题描述】:

我从这里得到一个 tcp 服务器的例子:http://www.voidrealms.com/index.php?r=tutorial/view&id=256 并试图添加 gui。

ma​​inwindow.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);
}

所以,在新的客户端连接上

emit UpdateDevicesList(fields);

将 QStringList 字段发送到

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() 显示它们,但由于某种原因 tableWidget 未设置。

【问题讨论】:

    标签: c++ qt user-interface signals-slots


    【解决方案1】:

    使用 QTableWidget 时,您必须使用 setRowCount 和 setColumnCount 方法指定行数和列数。

    另外,你应该避免使用QTableWidget,而使用QTableView。

    【讨论】:

    • 是的,我知道,我将它们设置为设计模式。我正在尝试设置其他数据,例如ui-&gt;lineEdit-&gt;setText("get");,但什么也没发生,但是如果我通过按钮事件在主窗口内调用on_UpdateDevicesList(data),一切正常,evrything 更新,tableWidget 从 myclien.cpp 和@QStringList fields 获取一行数据987654324@获取字符串。
    • 好吧,我想我找到了问题所在。我不确定你想通过为每个客户端创建 MainWindow 的新实例来实现什么,但你需要在 MyServer::incomingConnection 中调用 mainwindow->show()
    【解决方案2】:

    是的,错误是在每个新连接上我都在创建主窗口的新实例:mainwindow = new MainWindow(); 但我已经用另一种方式解决了这个问题,现在一切正常:

    ma​​in.cpp:

    MainWindow *pw;
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        pw = new MainWindow;
        pw->show();
        return a.exec();
    }
    

    myserver.cpp:

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

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多