我的使用的环境:使用的QT版本是QT5.6.1。电脑windows系统是win7旗舰版。
文件列表:
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();
void sendSlot();
signals:
/**
* 信号必须要signals关键字来声明
* 信号没有返回值, 但可以有参数
* 信号就是函数的声明, 无需定义
* 使用: emit mySignal();
* 信号可以被重载
*/
void mySignal();
void mySignalParm(int, QString);
public slots:
private:
QPushButton * bt;
};
#endif // SUBWIDGET_H
subwidget.cpp
#include "subwidget.h"
#include "widget.h"
SubWidget::SubWidget(QWidget *parent)
: QWidget(parent)
{
this->setParent(parent);
this->setWindowTitle(QString("小弟"));
//this->resize(QSize(500, 500));
bt = new QPushButton(this);
bt->setText(QString("切换到主窗口"));
bt->move(QPoint(50, 50));
connect(bt, &QPushButton::clicked, this, &SubWidget::sendSlot);
this-> showMaximized();
}
SubWidget::~SubWidget()
{
}
void SubWidget::sendSlot()
{
emit mySignal();
emit mySignalParm(300, QString("已经切换到主窗口"));
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <QtCore/QDebug>
#include "subwidget.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
signals:
public slots:
void myButtonReleasedSlot();
void myChangeWin();
void myDealSub();
void myDealSubParm(int, QString);
private:
Ui::Widget *ui;
QPushButton * bt1;
QPushButton * bt2;
QPushButton * bt3;
SubWidget * sw;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setParent(parent);
this->setWindowTitle(QString::fromUtf8("老大"));
this->resize(QSize(500, 500));
bt1 = new QPushButton(this);
bt1->setText(QString("关闭窗口"));
bt1->move(QPoint(50, 50));
/**
* bt1: 信号发出者, 指针类型
* &QPushButton::pressed: 信号的发射 &发送者的类名::信号名字
* this: 信号接受者, 指针类型
* &Widget::close: 信号的处理 &接收的类名::槽名字
*
*/
connect(bt1, &QPushButton::pressed, this, &Widget::close);
bt2 = new QPushButton(this);
bt2->setText(QString("隐藏关闭窗口按钮以及改变自身文本内容"));
bt2->move(QPoint(100, 100));
/**
* Qt5: 槽和普通的C++成员函数几乎是一样的
* 可以是虚函数,可以被重载,可以是public slots、protected slots、private slots,可以被其他C++成员函数直接调用
* 唯一不同的是:槽还可以和信号连接在一起,在这种情况下,信号被发射时,会自动调用这个槽
* 槽不需要信号传过来的参数时,可以不要参数;但槽函数一旦要参数,其参数个数,类型,顺序必须要和对应的信号保持一致。另外,槽函数的参数不能有缺省值。
* 由于信号的返回值为void, 槽必须和信号的返回值保持一致, 因此槽的返回值为void
*
*/
connect(bt2, &QPushButton::released, this, &Widget::myButtonReleasedSlot);
connect(bt2, &QPushButton::released, bt1, &QPushButton::hide);
bt3 = new QPushButton(this);
bt3->setText(QString("切换到子窗口"));
bt3->move(QPoint(150, 150));
sw = new SubWidget();
connect(bt3, &QPushButton::released, this, &Widget::myChangeWin);
void (SubWidget::*funSignal)() = &SubWidget::mySignal;
void (SubWidget::*funSignalParm)(int, QString) = &SubWidget::mySignalParm;
void (Widget::*funSlot)() = &Widget::myDealSub;
void (Widget::*funSlotParm)(int, QString) = &Widget::myDealSubParm;
connect(sw, funSignal, this, funSlot);
connect(sw, funSignalParm, this, funSlotParm);
/**
* Lambda 表达式, 匿名函数对象
* C++11 新增加的特性, 编译时需要添加参数C++11
* Qt配合信号一起使用, 非常方便
*/
QPushButton *bt4 = new QPushButton(this);
bt4->setText(QString("Lambda表达式并统计次数"));
bt4->move(QPoint(200, 200));
int cout = 0;
connect(bt4, &QPushButton::clicked, this,
// = : 把外部所有局部变量、类中所有成员以值传递方式
// this : 类中所有成员以值传递方式
// & : 把外部所有局部变量, 引用符号
[=](bool isCheck) mutable {
cout++;
bt4->setText(QString("点击次数: ") + QString::number(cout));
qDebug() << QString("这是一个Lambda表达式测试输出").toStdString().c_str();
qDebug() << QString("打印参数: ").toStdString().c_str() << isCheck;
});
}
Widget::~Widget()
{
//delete ui;
}
void Widget::myButtonReleasedSlot()
{
if (bt2 != nullptr)
{
bt2->setText(QString("发送信号, 槽处理完成 ..."));
}
}
void Widget::myChangeWin()
{
this->hide();
sw->show();
}
void Widget::myDealSub()
{
this->show();
sw->hide();
}
void Widget::myDealSubParm(int num, QString str)
{
qDebug() << "num: " << num << " str: " << str.toUtf8().data();
qDebug() << "num: " << num << " str: " << str.toStdString().c_str();
qWarning() << "num: " << num << " str: " << str.toUtf8().data();
qInfo() << "num: " << num << " str: " << str.toUtf8().data();
//qFatal(str.toUtf8().data());
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
w.showMaximized();
return a.exec();
}
subwidget.ui和widget.ui无需操作设计。
运行后: