如何在客户端连接时在QT中更新QGraphicsView
How to update QGraphicsView in QT when client is connected?
我在更新QGraphicsView时遇到问题。当我在类 myServer 中调用我的函数 void drawConnection(( 时,我必须更新我的 QGraphicsView 它不起作用,但在函数中我有 qDeubg(( 并且正在调用。据我了解,问题不在于函数调用。
主窗口.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtGui>
#include <QtCore>
#include <QGraphicsScene>
#include <QMouseEvent>
#include <QEvent>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
static MainWindow* GetInstance(QWidget* parent = 0);
int matrix_[10][10];
int fire_[10][10];
int mylife = 10;
public:
Ui::MainWindow *ui;
static MainWindow* mainInstance;
QGraphicsScene *scene;
QGraphicsEllipseItem *ellipse;
QGraphicsRectItem *rectangle;
QGraphicsTextItem *text_;
QGraphicsTextItem *connection;
void mousePressEvent(QMouseEvent *ev);
public:
//matrix
void drawing();
void createMatrix();
void creatShip();
//fire
void createFireMatrix();
void drawingFire();
//life
void drawingYourLife();
public:
//conection
void drawConnection();
void drawDisConnection();
};
#endif // MAINWINDOW_H
主窗口.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow* MainWindow::mainInstance = 0;
MainWindow* MainWindow::GetInstance(QWidget *parent)
{
if(mainInstance == NULL)
{
mainInstance = new MainWindow(parent);
}
return mainInstance;
}
void MainWindow::drawConnection()
{
qDebug()<<"LOL";
scene = new QGraphicsScene(this);
ui->graphicsView_5->setScene(scene);
QFont seriFont("Times",30,QFont::Bold);
connection = scene->addText("Client is connecting",seriFont);
}
我的服务器.h
#ifndef MYSERVER_H
#define MYSERVER_H
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMainWindow>
namespace Ui { class MainWindow; }
class myServer: public QTcpServer
{
Q_OBJECT
public:
myServer();
~myServer();
public:
QTcpSocket* socket;
QByteArray Data;
MainWindow* instance = MainWindow::GetInstance();
public slots:
void startServer();
void incomingConnection(int socketDescriptor);
void sockReady();
void sockDisc();
};
#endif // MYSERVER_H
我的服务器.cpp
#include "myserver.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QWidget>
#include <QGraphicsItem>
myServer::myServer(){}
myServer::~myServer(){}
void myServer::startServer()
{
if(this->listen(QHostAddress::Any,5555))
{
qDebug()<<"LISTEN";
}
else{
qDebug()<<"NOT LISTEN";
}
}
void myServer::incomingConnection(int socketDescriptor)
{
socket = new QTcpSocket(this);
socket->setSocketDescriptor(socketDescriptor);
connect(socket,SIGNAL(readyRead()),this,SLOT(sockReady()));
connect(socket,SIGNAL(disconnected()),this,SLOT(sockDisc()));
qDebug()<<socketDescriptor<< "Client connected";
socket->write("You are connect");
qDebug()<<"Send client connect status - YES";
}
void myServer::sockReady()
{
instance->drawConnection();
}
void myServer::sockDisc()
{
qDebug()<<"DISCONECT";
socket->deleteLater();
}
不要表明你的意思qDebug()
,在我的情况下,在我的情况下没有调用连接。另外,我看到您正在实现不必要的方法,您可以查看以下示例:财富服务器示例。
我没有实现incomingConnection()
方法,但我只使用了信号newConnection
和方法nextPendingConnection()
。
我的服务器.h
#ifndef MYSERVER_H
#define MYSERVER_H
#include "mainwindow.h"
#include <QTcpServer>
class MyServer : public QTcpServer
{
public:
using QTcpServer::QTcpServer;
void startServer();
private:
MainWindow* instance = MainWindow::instance();
void sockReady();
void sockDisc();
};
#endif // MYSERVER_H
我的服务器.cpp
#include "myserver.h"
#include <QDebug>
#include <QTcpSocket>
void MyServer::startServer()
{
if(listen(QHostAddress::Any,5555))
qDebug()<<"LISTEN";
else
qDebug()<<"NOT LISTEN";
connect(this,&QTcpServer::newConnection,this,&MyServer::sockReady);
}
void MyServer::sockReady()
{
QTcpSocket *socket = nextPendingConnection();
qDebug()<<"CONNECTED";
instance->drawConnection();
connect(socket, &QTcpSocket::disconnected, this, &MyServer::sockDisc);
}
void MyServer::sockDisc()
{
QTcpSocket *socket = qobject_cast< QTcpSocket *>(sender());
qDebug()<<"DISCONECT";
if(socket)
socket->deleteLater();
}
我已经重新排序了主窗口代码。
主窗口.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class QGraphicsTextItem;
class QGraphicsScene;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
static MainWindow *instance(QWidget* parent = 0);
~MainWindow();
void drawConnection();
private:
MainWindow(QWidget *parent = 0);
Ui::MainWindow *ui;
static MainWindow* mInstance;
QGraphicsScene *scene;
QGraphicsTextItem *connection;
};
#endif // MAINWINDOW_H
主窗口.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsScene>
#include <QGraphicsView>
MainWindow* MainWindow::mInstance = 0;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);
}
MainWindow *MainWindow::instance(QWidget *parent)
{
if(mInstance == NULL)
mInstance = new MainWindow(parent);
return mInstance;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::drawConnection()
{
QFont seriFont("Times", 30, QFont::Bold);
connection = scene->addText("Client is connecting",seriFont);
}
完整的示例可以在以下链接中找到。
相关文章:
- Qt:当QListView获得新条目时,如何更新QStringList
- 将 Qt 代码从 createTextureFromId 更新为 createTextureFromNativeObje
- Qt:更新 QString 时自动生成的代码失败
- 如何在 qt c++ 中更新 QWindow,文本不显示
- 更新了Qt库;无法再构建了
- 如果存在 QSQLITE 数据库,则根据 qt 中的行值插入或更新
- Qt多线程:如何更新两个QLabel?
- 在Visual Studio中更新Qt翻译(.ts文件)时出现未指定错误
- GUI在qt中同时更新和控制
- 需要更新Qt .pro和Visual Studio .vcxproj添加新文件
- 从另一个线程更新QT小部件的一种详细方法
- 从其他std ::线程更新QT GUI
- 如何每秒调用更新Qt小部件的函数
- 无法更新 qt 对话框中的按钮
- 从其他线程更新QT图形视图
- 如何通过在另一个线程中提出的升压信号更新QT GUI
- 按线程更新 QT
- 当运行一个方法时更新qt GUI
- (更新)QT QML 5.6 - 什么原因导致此警告"QApplication was not created in the main() thread"?
- 在调用exec之前,更新Qt映像不起作用