我是QT和C ++的新手。我遇到了一个问题,我有两个不同的类,从B.cpp我想访问A.cpp的变量。使用调试消息我已经看到代码在setter函数中命中,但它从不设置Textbrowser的值。
这是main.cpp的代码。
#include <QApplication>
#include "window.h"
#include "socket.h"
int main(int argc, char **argv)
{
QApplication app (argc, argv);
Window *window = new Window();
Socket *socket = new Socket();
window->setStyleSheet("background-color: rgb(226, 226, 226);");
window->showFullScreen();
return app.exec();
}
这是window.h
#ifndef WINDOW_H
#define WINDOW_H
#include <QWidget>
class QPushButton;
class QTextBrowser;
class QString;
class Window : public QWidget
{
Q_OBJECT
public:
explicit Window(QWidget *parent = 0);
QPushButton *helloButton;
QPushButton *exitButton;
QPushButton *resetButton;
QTextBrowser *clientMsgWindow;
public slots:
void reset();
void setClientWindow(QString str);
};
#endif // WINDOW_H
这是Window.cpp
#include "window.h"
#include <QPushButton>
#include <QTextBrowser>
#include <QDebug>
#include <QString>
Window::Window(QWidget *parent) : QWidget(parent)
{
/****************** Hello BUTTON ********************/
helloButton = new QPushButton(this);
helloButton->setIconSize(QSize(145, 145));
helloButton->setGeometry(15, 160, 145, 145);
helloButton->setText("Hello World");
/******************reset BUTTON ********************/
resetButton = new QPushButton(this);
resetButton->setIconSize(QSize(145, 145));
resetButton->setGeometry(15, 160, 145, 145);
resetButton->setText("Click to Reset");
/************* EXIT BUTTON *********************/
exitButton = new QPushButton(this);
exitButton->setIcon(QIcon(":/new/prefix1/images/exit.png"));
exitButton->setIconSize(QSize(145, 145));
exitButton->setGeometry(635, 10, 145, 145);
//exitButton->setStyleSheet("background-color: rgb(236, 236, 236);");
// Signal and slot for EXIT button
qDebug() << connect(exitButton, SIGNAL (clicked()), this, SLOT (close()));
/*************** TEXT BROWSER *********************/
clientMsgWindow = new QTextBrowser(this);
clientMsgWindow->setMinimumSize(QSize(0,0));
clientMsgWindow->setMaximumSize(QSize(10000,10000));
clientMsgWindow->setGeometry(175, 50, 440, 420);
clientMSgWindow->setStyleSheet("background-color: rgb(236, 236, 236);");
}
void Window::setClientWindow(QString Str)
{
qDebug() << "Hit in Set client window to set Text";
qDebug() << Str;
clientMsgWindow->setText("This is the message from client");
clientMsgWindow->setText(Str);
qDebug() << "Setting text done";
}
/**** Slot to reset the text browser **********/
void Window::reset()
{
qDebug() << "Process in Reset Window";
clientMsgWindow->clear();
}
这是socket.h
#ifndef SOCKET_H
#define SOCKET_H
#include <QObject>
#include <QDebug>
#include <QTcpServer>
#include <QTcpSocket>
class QTextBrowser;
class Socket : public QObject
{
Q_OBJECT
public:
explicit Socket(QObject *parent = 0);
void setWindow(Window *w);
signals:
public slots:
void newConnection();
private:
QTcpServer *server;
Window *window;
};
#endif // SOCKET_H
这是socket.cpp
#include "socket.h"
#include "window.h"
#include <QWidget>
#include <QString>
Socket::Socket(QObject *parent):
QObject(parent)
{
server = new QTcpServer(this);
connect(server, SIGNAL(newConnection()), this, SLOT(newConnection()));
if(!server->listen(QHostAddress::QHostAddress("192.168.2.1"), 2793)){
qDebug() << "SERVER NOT STARTED";
}
else{
qDebug() << "SERVER STARTED";
}
}
void Socket::setWindow(Window *w)
{
this->window = w;
}
void Socket::newConnection()
{
QString clientMsg ;
QTcpSocket *socket= server->nextPendingConnection();
socket->write("Server Running on 192.168.2.1");
socket->flush();
socket->waitForBytesWritten();
// Recieve the data from Client
socket->waitForReadyRead();
qDebug() << (clientMsg = socket->readAll());
// Set the Textbrowser clientMsgWindow
this->window->setClientWindow(clientMsg);
}
每次客户端发送消息时,GUI都会终止。
答案 0 :(得分:0)
您应该拥有一个实例,而不是为每个连接创建一个新的Window实例。您可以使用setWindow()方法使其成为单例,或使其成为Socket的成员,如下所示:
$('#foo').pluginName(); //#foo
$('[name="foo"]').pluginName(); //[name="foo"]
$('.foo').pluginName(); //.foo
您甚至可以将窗口参数添加到构造函数中,这样您就可以始终设置它。
答案 1 :(得分:0)
你的设计似乎有缺陷。当你打电话
Window* pWindow = new Window();
pWindow->setclientWindow(clientMsg);
在您的newConnection
方法中,您正在创建一个新的窗口对象并在那里设置文本。但是,这与您在main
方法中创建的窗口对象不同,因此很明显您无法在那里看到该文本。实际上,您在newConnection
方法中创建的对象将永远丢失,因为您不会将指针保存在任何位置,这也会导致内存泄漏,因为您无法清理它。你必须通过存储指向另一个的指针来以某种方式连接你的两个对象。
答案 2 :(得分:0)
Object::connect: No such slot Socket::Window::setClientWindow()
此错误表明您的信号槽参数不兼容,因为setClientWindow
采用QString
参数,并且发出了无效信号readReady
。
编辑:在您的评论之后,我发现您需要了解信号/插槽的基本概念。
您的连接应该是:
QObject::connect(socket, SIGNAL(readyRead()), window, SLOT(setClientWindow()))
但是您没有可以连接套接字的窗口对象。您需要重构代码,因为它有许多设计问题。