https://www.cnblogs.com/lsgxeva/p/7808906.html
文件列表:
SubWidget.h
#ifndef SUBWIDGET_H #define SUBWIDGET_H
#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = 0);
~SubWidget();
</span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sendSlot();
signals:
/
* 信号必须要signals关键字来声明
* 信号没有返回值, 但可以有参数
* 信号就是函数的声明, 无需定义
* 使用: emit mySignal();
* 信号可以被重载
*/
void mySignal();
void mySignalParm(int, QString);
public slots:
private:
QPushButton * bt;
};
#endif // SUBWIDGET_H
SubWidget.cpp
#include "SubWidget.h"
-
SubWidget::SubWidget(QWidget *
parent)
-
QWidget(parent)
{
this-> setParent(parent);
this->setWindowTitle(QString::fromLocal8Bit( “ 小弟 ” ));
this->resize(QSize( 500, 500 ));
bt </span>= <span style="color: #0000ff;">new</span> QPushButton(<span style="color: #0000ff;">this</span><span style="color: #000000;">);
bt</span>->setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">切换到主窗口</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt</span>->move(QPoint(<span style="color: #800080;">50</span>, <span style="color: #800080;">50</span><span style="color: #000000;">));
connect(bt, </span>&QPushButton::clicked, <span style="color: #0000ff;">this</span>, &<span style="color: #000000;">SubWidget::sendSlot);
}
SubWidget::~SubWidget()
{
}
void SubWidget::sendSlot()
{
emit mySignal();
emit mySignalParm(300, QString::fromLocal8Bit(“已经切换到主窗口”));
}
mainwidget.h
#ifndef MAINWIDGET_H #define MAINWIDGET_H
#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <QtCore/QDebug>
#include “ui_mainwidget.h”
#include “SubWidget.h”
class MainWidget : public QWidget
{
Q_OBJECT
public:
explicit MainWidget(QWidget *parent = 0);
~MainWidget();
signals:
public slots:
void myButtonReleasedSlot();
void myChangeWin();
void myDealSub();
void myDealSubParm(int, QString);
private:
Ui::MainWidgetClass ui;
QPushButton </span>*<span style="color: #000000;"> bt1;
QPushButton </span>*<span style="color: #000000;"> bt2;
QPushButton </span>*<span style="color: #000000;"> bt3;
SubWidget </span>*<span style="color: #000000;"> sw;
};
#endif // MAINWIDGET_H
mainwidget.cpp
#include "mainwidget.h"
-
MainWidget::MainWidget(QWidget *
parent)
-
QWidget(parent)
{
ui.setupUi( this );
</span><span style="color: #0000ff;">this</span>-><span style="color: #000000;">setParent(parent);
</span><span style="color: #0000ff;">this</span>->setWindowTitle(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">老大</span><span style="color: #800000;">"</span><span style="color: #000000;">));
</span><span style="color: #0000ff;">this</span>->resize(QSize(<span style="color: #800080;">500</span>, <span style="color: #800080;">500</span><span style="color: #000000;">));
bt1 </span>= <span style="color: #0000ff;">new</span> QPushButton(<span style="color: #0000ff;">this</span><span style="color: #000000;">);
bt1</span>->setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">关闭窗口</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt1</span>->move(QPoint(<span style="color: #800080;">50</span>, <span style="color: #800080;">50</span><span style="color: #000000;">));
</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
* bt1: 信号发出者, 指针类型
* &QPushButton::pressed: 信号的发射 &发送者的类名::信号名字
* this: 信号接受者, 指针类型
* &MainWidget::close: 信号的处理 &接收的类名::槽名字
*
</span><span style="color: #008000;">*/</span><span style="color: #000000;">
connect(bt1, </span>&QPushButton::pressed, <span style="color: #0000ff;">this</span>, &<span style="color: #000000;">MainWidget::close);
bt2 </span>= <span style="color: #0000ff;">new</span> QPushButton(<span style="color: #0000ff;">this</span><span style="color: #000000;">);
bt2</span>->setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">隐藏关闭窗口按钮以及改变自身文本内容</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt2</span>->move(QPoint(<span style="color: #800080;">100</span>, <span style="color: #800080;">100</span><span style="color: #000000;">));
</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
* Qt5: 槽和普通的C++成员函数几乎是一样的
* 可以是虚函数,可以被重载,可以是public slots、protected slots、private slots,可以被其他C++成员函数直接调用
* 唯一不同的是:槽还可以和信号连接在一起,在这种情况下,信号被发射时,会自动调用这个槽
* 槽不需要信号传过来的参数时,可以不要参数;但槽函数一旦要参数,其参数个数,类型,顺序必须要和对应的信号保持一致。另外,槽函数的参数不能有缺省值。
* 由于信号的返回值为void, 槽必须和信号的返回值保持一致, 因此槽的返回值为void
*
</span><span style="color: #008000;">*/</span><span style="color: #000000;">
connect(bt2, </span>&QPushButton::released, <span style="color: #0000ff;">this</span>, &<span style="color: #000000;">MainWidget::myButtonReleasedSlot);
connect(bt2, </span>&QPushButton::released, bt1, &<span style="color: #000000;">QPushButton::hide);
bt3 </span>= <span style="color: #0000ff;">new</span> QPushButton(<span style="color: #0000ff;">this</span><span style="color: #000000;">);
bt3</span>->setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">切换到子窗口</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt3</span>->move(QPoint(<span style="color: #800080;">150</span>, <span style="color: #800080;">150</span><span style="color: #000000;">));
sw </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> SubWidget();
connect(bt3, </span>&QPushButton::released, <span style="color: #0000ff;">this</span>, &<span style="color: #000000;">MainWidget::myChangeWin);
</span><span style="color: #0000ff;">void</span> (SubWidget::*funSignal)() = &<span style="color: #000000;">SubWidget::mySignal;
</span><span style="color: #0000ff;">void</span> (SubWidget::*funSignalParm)(<span style="color: #0000ff;">int</span>, QString) = &<span style="color: #000000;">SubWidget::mySignalParm;
</span><span style="color: #0000ff;">void</span> (MainWidget::*funSlot)() = &<span style="color: #000000;">MainWidget::myDealSub;
</span><span style="color: #0000ff;">void</span> (MainWidget::*funSlotParm)(<span style="color: #0000ff;">int</span>, QString) = &<span style="color: #000000;">MainWidget::myDealSubParm;
connect(sw, funSignal, </span><span style="color: #0000ff;">this</span><span style="color: #000000;">, funSlot);
connect(sw, funSignalParm, </span><span style="color: #0000ff;">this</span><span style="color: #000000;">, funSlotParm);
</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
* Lambda 表达式, 匿名函数对象
* C++11 新增加的特性, 编译时需要添加参数C++11
* Qt配合信号一起使用, 非常方便
</span><span style="color: #008000;">*/</span><span style="color: #000000;">
QPushButton </span>*bt4 = <span style="color: #0000ff;">new</span> QPushButton(<span style="color: #0000ff;">this</span><span style="color: #000000;">);
bt4</span>->setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">Lambda表达式并统计次数</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt4</span>->move(QPoint(<span style="color: #800080;">200</span>, <span style="color: #800080;">200</span><span style="color: #000000;">));
</span><span style="color: #0000ff;">int</span> cout = <span style="color: #800080;">0</span><span style="color: #000000;">;
connect(bt4, </span>&QPushButton::clicked, <span style="color: #0000ff;">this</span><span style="color: #000000;">,
</span><span style="color: #008000;">//</span><span style="color: #008000;"> = : 把外部所有局部变量、类中所有成员以值传递方式
</span><span style="color: #008000;">//</span><span style="color: #008000;"> this : 类中所有成员以值传递方式
</span><span style="color: #008000;">//</span><span style="color: #008000;"> & : 把外部所有局部变量, 引用符号</span>
[=](<span style="color: #0000ff;">bool</span><span style="color: #000000;"> isCheck) mutable {
cout</span>++<span style="color: #000000;">;
bt4</span>->setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">点击次数: </span><span style="color: #800000;">"</span>) +<span style="color: #000000;"> QString::number(cout));
qDebug() </span><< QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">这是一个Lambda表达式测试输出</span><span style="color: #800000;">"</span><span style="color: #000000;">).toStdString().c_str();
qDebug() </span><< QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">打印参数: </span><span style="color: #800000;">"</span>).toStdString().c_str() <<<span style="color: #000000;"> isCheck;
});
}
MainWidget::~MainWidget()
{
// 直接或间接继承于QObject的对象, 在释放的内存的时候, 会自动调用析构函数, 释放子对象的内存
// 故QPushButton bt1 bt2 bt3 bt4 会随着QWidget MainWidget的释放而自动调用子对象的析构函数, 释放子对象的内存
}
void MainWidget::myButtonReleasedSlot()
{
if (bt2 != nullptr)
{
bt2->setText(QString::fromLocal8Bit(“发送信号, 槽处理完成 …”));
}
}
void MainWidget::myChangeWin()
{
this->hide();
sw->show();
}
void MainWidget::myDealSub()
{
this->show();
sw->hide();
}
void MainWidget::myDealSubParm(int num, QString str)
{
qDebug() << "num: " << num << " str: " << str.toUtf8().data();
qDebug() << "num: " << num << " str: " << str.toStdString().c_str();
qWarning() </span><< <span style="color: #800000;">"</span><span style="color: #800000;">num: </span><span style="color: #800000;">"</span> << num << <span style="color: #800000;">"</span><span style="color: #800000;"> str: </span><span style="color: #800000;">"</span> <<<span style="color: #000000;"> str.toUtf8().data();
qInfo() </span><< <span style="color: #800000;">"</span><span style="color: #800000;">num: </span><span style="color: #800000;">"</span> << num << <span style="color: #800000;">"</span><span style="color: #800000;"> str: </span><span style="color: #800000;">"</span> <<<span style="color: #000000;"> str.toUtf8().data();
</span><span style="color: #008000;">//</span><span style="color: #008000;">qFatal(str.toUtf8().data());</span>
}
main.cpp
#include "mainwidget.h" #include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWidget w; // 执行MainWidget的构造函数
w.show();
return a.exec();
}
效果现象: