我如何 return 来自 Qt5 中的 SLOT 的值?
How can I return a value from SLOT in Qt5?
我是Qt 环境的新手。我最近开始了一个 QtCreator
项目,用于一个简单的聊天应用程序 (QMainWindow)。我几乎完成了该项目,但仍然坚持 SIGNAL/SLOT problem
.
让我简要解释一下我的问题:
Due to the length of the code I am not able to paste it here.
- 我有两个 classes
MainWindow
和 NetworkFile
.
- NetworkFile 中的函数
newServerConn()
将信号 readyRead()
连接到插槽 readFromClient()
。
- 客户端return编辑的字符串存储在
readFromClient()
SLOT中的QString
中。
问题:
我必须 return 插槽中的 QString 到 newServerConn()
函数,然后从那里到 MainWindow
class 中的函数,因为只有这样我才能将字符串打印到 ui
对象指向的 plainLineEdit
小部件。
问题 1:
我怎样才能 return 来自插槽的值?
问题二:
或者有什么方法可以在 NetworkFile
class 中获取 ui
实例的副本,以便我可以从那里使用小部件?
谢谢。
从 documentation 开始:
Signals [...] can never have return types (i.e. use void).
因此,槽 return 类型在通过信号调用时是无用的(即使您在直接调用槽时仍然可以使用它们,即如果它是成员函数)。
也就是说,您可以通过引用或插槽中的地址(即如果它是 lambda)捕获 ui
甚至更好的 plainLineEdit
并从那里正确设置字符串。
我只是将数据作为信号发出,并连接新信号和插槽之间的连接,然后将字符串添加到 ui。
A quick self-contained 示例(顺便说一句。"Due to the length of the code I am not able to paste it here." 只是一个借口,您几乎总是可以减少相关代码)
Header:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QTextEdit>
class NetworkFile;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow(){}
public slots:
void addText(QString str)
{
edit->append(str);
}
private:
QTextEdit* edit;
NetworkFile* net;
};
class NetworkFile : public QObject
{
Q_OBJECT
public:
NetworkFile(QObject *parent = 0):
QObject(parent)
{
connect(&server, &QTcpServer::newConnection,
this, &NetworkFile::newConnection);
//TODO: check return value
server.listen(QHostAddress::Any,16001);
}
signals:
void dataRead(QString);
public slots:
void newConnection(){
//TODO: wire up socket disconnect with deleteLater, also check for null
QTcpSocket* socket = server.nextPendingConnection();
connect(socket, &QTcpSocket::readyRead,
this, &NetworkFile::dataAvailable);
}
void dataAvailable(){
//HACK: only for brevity, create a connection wrapper that contains the socket in real code
QTcpSocket* source = (QTcpSocket*)sender();
auto bytes = source->readAll();
if(bytes.size())
{
emit dataRead(QString(bytes));
}
}
private:
QTcpServer server;
};
#endif // MAINWINDOW_H
cpp 文件
#include "mainwindow.h"
#include <QApplication>
MainWindow::MainWindow(QWidget *parent ):
QMainWindow(parent)
{
edit = new QTextEdit(this);
net = new NetworkFile(this);
connect(net, &NetworkFile::dataRead,
this, &MainWindow::addText );
setCentralWidget(edit);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
我是Qt 环境的新手。我最近开始了一个 QtCreator
项目,用于一个简单的聊天应用程序 (QMainWindow)。我几乎完成了该项目,但仍然坚持 SIGNAL/SLOT problem
.
让我简要解释一下我的问题:
Due to the length of the code I am not able to paste it here.
- 我有两个 classes
MainWindow
和NetworkFile
. - NetworkFile 中的函数
newServerConn()
将信号readyRead()
连接到插槽readFromClient()
。 - 客户端return编辑的字符串存储在
readFromClient()
SLOT中的QString
中。
问题:
我必须 return 插槽中的 QString 到 newServerConn()
函数,然后从那里到 MainWindow
class 中的函数,因为只有这样我才能将字符串打印到 ui
对象指向的 plainLineEdit
小部件。
问题 1: 我怎样才能 return 来自插槽的值?
问题二:
或者有什么方法可以在 NetworkFile
class 中获取 ui
实例的副本,以便我可以从那里使用小部件?
谢谢。
从 documentation 开始:
Signals [...] can never have return types (i.e. use void).
因此,槽 return 类型在通过信号调用时是无用的(即使您在直接调用槽时仍然可以使用它们,即如果它是成员函数)。
也就是说,您可以通过引用或插槽中的地址(即如果它是 lambda)捕获 ui
甚至更好的 plainLineEdit
并从那里正确设置字符串。
我只是将数据作为信号发出,并连接新信号和插槽之间的连接,然后将字符串添加到 ui。
A quick self-contained 示例(顺便说一句。"Due to the length of the code I am not able to paste it here." 只是一个借口,您几乎总是可以减少相关代码)
Header:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QTextEdit>
class NetworkFile;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow(){}
public slots:
void addText(QString str)
{
edit->append(str);
}
private:
QTextEdit* edit;
NetworkFile* net;
};
class NetworkFile : public QObject
{
Q_OBJECT
public:
NetworkFile(QObject *parent = 0):
QObject(parent)
{
connect(&server, &QTcpServer::newConnection,
this, &NetworkFile::newConnection);
//TODO: check return value
server.listen(QHostAddress::Any,16001);
}
signals:
void dataRead(QString);
public slots:
void newConnection(){
//TODO: wire up socket disconnect with deleteLater, also check for null
QTcpSocket* socket = server.nextPendingConnection();
connect(socket, &QTcpSocket::readyRead,
this, &NetworkFile::dataAvailable);
}
void dataAvailable(){
//HACK: only for brevity, create a connection wrapper that contains the socket in real code
QTcpSocket* source = (QTcpSocket*)sender();
auto bytes = source->readAll();
if(bytes.size())
{
emit dataRead(QString(bytes));
}
}
private:
QTcpServer server;
};
#endif // MAINWINDOW_H
cpp 文件
#include "mainwindow.h"
#include <QApplication>
MainWindow::MainWindow(QWidget *parent ):
QMainWindow(parent)
{
edit = new QTextEdit(this);
net = new NetworkFile(this);
connect(net, &NetworkFile::dataRead,
this, &MainWindow::addText );
setCentralWidget(edit);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}