【发布时间】:2016-01-03 02:12:12
【问题描述】:
我正在与 qt creator 合作,我想为实现 UI 的类获取一个 QByteArray,比如说 A 类。B 类实现串行连接 (RS232) 并通过以下方式接收数据:
QSerialPort::connect(serialport,SIGNAL(readyRead()),this,SLOT(SerialPortManager::GiveReceivedDataToUI()));
所以在我的方法SerialPortManager::GiveReceivedDataToUI(){} 中,我将从我的串行连接中读取所有数据,如下所示:serialport->readAll(); 数据(存储在 QByteArray 中)仍在 B 类中。现在我想将此数据放入文本框A类。
我写了一些关于从不同类访问 UI 元素的线程。尝试了另一个连接,但我可以弄清楚如何将我的数据连接到 A(UI) 类中写入文本框的方法。我想用体面的 OO 来写它,而不仅仅是公开它。
有什么建议吗?
更新
class SerialPortManager : QMainWindow
{
Q_OBJECT
private:
static SerialPortManager* instance;
protected:
SerialPortManager();
public:
static SerialPortManager* GetInstance();
void OpenSerialConnection();
void CloseSerialConnection();
void WriteSingleACLCommand(QString);
void WriteMultipleACLCommands();
public slots:
void GiveReceivedDataToUI();
signals:
void Send(QByteArray& s);
};
#endif // SERIALPORTMANAGER_H
【问题讨论】:
-
“如何将我的数据连接到 A(UI) 类中编写文本框的方法。我想用体面的 OO 编写它”,那是体面的 oop。是否也要将数据存储在 UI 类中?
-
您确定
a是正确的UI类实例吗?在你的 sn-pa似乎是一个临时实例。如果您在main中创建Class A 和Class B 的实例,则可以在那里建立连接。对于好的设计,SerialPortManager应该对你的UI类一无所知。还要确保只建立一次连接。 -
好吧,我有点困惑为什么
SerialPortManager是从QMainWindow派生的,我假设你确实使用这个类作为你的主窗口。但问题是class SerialPortManager : QMainWindow。在这里,您从QMainWindow私下派生,您应该公开派生:class SerialPortManager : public QMainWindow。顺便问一下,这个类为什么是单例类有什么原因吗? -
但是你真的在你的屏幕上显示这个类吗?您使用任何 GUI 功能吗?如果不是,那么您应该继承
QObject而不是QMainWindow。 -
最好的解决方案是在单独的线程类中启动,该线程类必须接收和发送数据到
RS232,因为在这种情况下程序可能会被冻结。所以对这个使用机制signal and slot。在Class A中,您将signal发送到Class B,并带有一些到RS323 的命令。Class B在插槽中接收到信号并向串口发送一些命令,然后在readyRead()中接收数据。当数据准备好时,Class B向Class A发出信号,并且数据将在Class A中接收而不会冻结。
标签: c++ qt user-interface serial-port