QT 主窗口和子窗口相互切换示例

85 篇文章 8 订阅

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>-&gt;setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">切换到主窗口</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt</span>-&gt;move(QPoint(<span style="color: #800080;">50</span>, <span style="color: #800080;">50</span><span style="color: #000000;">));

connect(bt, </span>&amp;QPushButton::clicked, <span style="color: #0000ff;">this</span>, &amp;<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>-&gt;<span style="color: #000000;">setParent(parent);
</span><span style="color: #0000ff;">this</span>-&gt;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>-&gt;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>-&gt;setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">关闭窗口</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt1</span>-&gt;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: 信号发出者, 指针类型
 * &amp;QPushButton::pressed: 信号的发射  &amp;发送者的类名::信号名字
 * this: 信号接受者, 指针类型
 * &amp;MainWidget::close: 信号的处理  &amp;接收的类名::槽名字
 *
 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
connect(bt1, </span>&amp;QPushButton::pressed, <span style="color: #0000ff;">this</span>, &amp;<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>-&gt;setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">隐藏关闭窗口按钮以及改变自身文本内容</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt2</span>-&gt;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>&amp;QPushButton::released, <span style="color: #0000ff;">this</span>, &amp;<span style="color: #000000;">MainWidget::myButtonReleasedSlot);
connect(bt2, </span>&amp;QPushButton::released, bt1, &amp;<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>-&gt;setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">切换到子窗口</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt3</span>-&gt;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>&amp;QPushButton::released, <span style="color: #0000ff;">this</span>, &amp;<span style="color: #000000;">MainWidget::myChangeWin);

</span><span style="color: #0000ff;">void</span> (SubWidget::*funSignal)() = &amp;<span style="color: #000000;">SubWidget::mySignal;
</span><span style="color: #0000ff;">void</span> (SubWidget::*funSignalParm)(<span style="color: #0000ff;">int</span>, QString) = &amp;<span style="color: #000000;">SubWidget::mySignalParm;
</span><span style="color: #0000ff;">void</span> (MainWidget::*funSlot)() = &amp;<span style="color: #000000;">MainWidget::myDealSub;
</span><span style="color: #0000ff;">void</span> (MainWidget::*funSlotParm)(<span style="color: #0000ff;">int</span>, QString) = &amp;<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>-&gt;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>-&gt;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>&amp;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;"> &amp; : 把外部所有局部变量, 引用符号</span>
    [=](<span style="color: #0000ff;">bool</span><span style="color: #000000;"> isCheck) mutable {
        cout</span>++<span style="color: #000000;">;
        bt4</span>-&gt;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>&lt;&lt; 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>&lt;&lt; QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">打印参数: </span><span style="color: #800000;">"</span>).toStdString().c_str() &lt;&lt;<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>&lt;&lt; <span style="color: #800000;">"</span><span style="color: #800000;">num: </span><span style="color: #800000;">"</span> &lt;&lt; num &lt;&lt; <span style="color: #800000;">"</span><span style="color: #800000;"> str: </span><span style="color: #800000;">"</span> &lt;&lt;<span style="color: #000000;"> str.toUtf8().data();
qInfo() </span>&lt;&lt; <span style="color: #800000;">"</span><span style="color: #800000;">num: </span><span style="color: #800000;">"</span> &lt;&lt; num &lt;&lt; <span style="color: #800000;">"</span><span style="color: #800000;"> str: </span><span style="color: #800000;">"</span> &lt;&lt;<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();
}

复制代码

 

效果现象:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值