QT——模块化窗口,实现信号和槽通信
需求:主窗口中有一个打印窗口,将打印窗口单独抽离出来,主窗口向打印窗口发送信号,在打印窗口打印字符串。
使用单例模式实现
打印窗口代码
logWidget.h
#pragma once
#include <qwidget.h>
#include <qplaintextedit.h>
#include <qdebug.h>
#include <qlayout.h>
// 信息打印窗口:打印用户的操作提示信息。
// 使用单例模式只能创建一个对象
class LogWidget : public QWidget
{
private:
QPlainTextEdit* plainTextEdit_;
QStringList* logStringList_;
QString str_;
QHBoxLayout* hBoxLayoutLayout;
static LogWidget* logWidget;
LogWidget();
public:
static LogWidget* getLogWidget();
public slots:
void print(const QString str);
};
logWidget.cpp
#include "logWidget.h"
LogWidget::LogWidget()
{
plainTextEdit_ = new QPlainTextEdit();
logStringList_ = new QStringList();
str_ = "";
hBoxLayoutLayout = new QHBoxLayout();
hBoxLayoutLayout->addWidget(plainTextEdit_);
this->setLayout(hBoxLayoutLayout);
}
void LogWidget::print(const QString str)
{
if (str != "")
{
str_ = str;
plainTextEdit_->appendPlainText(str);
logStringList_->append(str);
}
}
LogWidget* LogWidget::logWidget = nullptr;
// 获取LogWidget实例
LogWidget* LogWidget::getLogWidget()
{
if (logWidget == nullptr)
{
logWidget = new LogWidget();
}
return logWidget;
}
mainwindow代码
首先引入头文件,实例化一个对象logWidget放入窗口中
logWidget = LogWidget::getLogWidget();
ui.mes_tabWidget->addTab(logWidget, "测试2");
定义并实现执行信号的函数和信号
// 执行打印窗口的信号函数
public:
void exeprintLog(const QString str_)
{
emit this->printLog(str_);
}
signals:
void printLog(const QString str_); // 打印窗口的信号
建立连接
connect(this, &mainwindow::printLog, this, [=](const QString str_) {
logWidget->print(str_);
});
执行
logWidget->exeprintLog("555");
完成