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");

完成

posted @ 2023-06-26 00:49  摩天仑  阅读(69)  评论(0编辑  收藏  举报