本人是菜鸟,这里记录的每天的学习内容
学习Qt 的第三天(笑着学)
一、学习内容:
1. 掌握自定义信号
2. 如何创建子窗口
3. 了解子窗口如何与主窗口之间进行信号的传递的
二、目的:利用按钮来实现主窗口和子窗口的切换
三、操作步骤:
一. 建立两个窗口(主窗口MainWidget.cpp和子窗口ZiWidget.cpp)
二. 在每个窗口中建立一个按钮 用来实现窗口之间的切换
三. 使用自定义信号,使子窗口可以发送信息到主窗口
一、建立两个窗口(主窗口MainWidget.cpp和子窗口ZiWidget.cpp)
1.建立一个新的03_day.pro项目,Class name为MainWidget,其他和之前操作一样新建。
2.在03_day.pro项目右键Add New
3.选中c++Class项目,下一步
4.子窗口类名设置为ZiWidget,下一步,然后会生成ziwidget.h头文件和ziwidget.cpp源文件
5.现在我们已经有了两个窗口,但是我们运行只能显示一个窗口,就是MainWidget主窗口
6.我把主窗口命名一下,前面讲过,在MainWidget.cpp中添加setWindowTitle,设置窗口标题为老大
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle("老大");
}
MainWidget::~MainWidget()
{
}
7.在ZiWidget.cpp中把子窗口标题改为小弟
#include "ziwidget.h"
ZiWidget::ZiWidget(QWidget *parent) : QWidget(parent)
{
setWindowTitle("小弟");
}
8.现在我们来实现同时显示主窗口和子窗口
1)在主窗口(MainWidget)头文件中包含子窗口(ZiWidget)头文件;
2)在私有成员中定义子窗口对象w1;
3)在主窗口源文件中显示子窗口对象w1.show();
主窗口头文件:
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include "ziwidget.h"//在主窗口(MainWidget)头文件中包含子窗口(ZiWidget)头文件
#include <QWidget>
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = nullptr);
~MainWidget();
private:
ZiWidget w1;//在私有成员中定义子窗口对象w1
};
#endif // MAINWIDGET_H
主窗口源文件:
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle("老大");
w1.show();
}
MainWidget::~MainWidget()
{
}
最后我们来运行一下,现在可以显示两个窗口了,老大和小弟:
二. 在每个窗口中建立一个按钮 用来实现窗口之间的切换
1.在主窗口建立一个按钮
主窗口头文件
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include "ziwidget.h"
#include <QWidget>
#include <QPushButton>
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = nullptr);
~MainWidget();
private:
QPushButton b1;
ZiWidget w1;
};
#endif // MAINWIDGET_H
主窗口源文件
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle("老大");
b1.setParent(this);
b1.setText("切换到子窗口");
b1.move(100,100);
resize(300,200);//定义窗口大小
w1.show();
}
MainWidget::~MainWidget()
{
}
子窗口头文件
#ifndef ZIWIDGET_H
#define ZIWIDGET_H
#include <QWidget>
#include <QPushButton>
class ZiWidget : public QWidget
{
Q_OBJECT
public:
explicit ZiWidget(QWidget *parent = nullptr);
signals:
private:
QPushButton b2;
};
#endif // ZIWIDGET_H
子窗口源文件
#include "ziwidget.h"
ZiWidget::ZiWidget(QWidget *parent) : QWidget(parent)
{
setWindowTitle("小弟");
b.setParent(this);
b.setText("切换到主窗口");
b.move(100,100);
resize(300,200);
}
运行之后得到 两个窗口 两个按钮
三、使用自定义信号,使子窗口可以发送信息到主窗口
1.隐藏主窗口,显示子窗口
在主窗口头文件中添加自定义槽函数 void change();
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include "ziwidget.h"
#include <QWidget>
#include <QPushButton>
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = nullptr);
~MainWidget();
void change();
private:
QPushButton b1;
ZiWidget w1;
};
#endif // MAINWIDGET_H
在主窗口源文件中设置信号和自定义槽函数的实现
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle("老大");
b1.setParent(this);
b1.setText("切换到子窗口");
b1.move(100,100);
resize(300,200);//定义窗口大小
//w1.show();
connect(&b1,&QPushButton::released,this,&MainWidget::change);
}
void MainWidget::change()
{
hide();//隐藏当前窗口
w1.show();//显示子窗口
}
MainWidget::~MainWidget()
{
}
2.在子窗口头文件中自定义信号函数和自定义槽函数,并在子窗口源文件中设置按钮b2信号和槽的实; 并在主窗口头文件添加自定义槽函数,源文件中设定子窗口的信号和槽函数的实现
子窗口头文件
#ifndef ZIWIDGET_H
#define ZIWIDGET_H
#include <QWidget>
#include <QPushButton>
class ZiWidget : public QWidget
{
Q_OBJECT
public:
explicit ZiWidget(QWidget *parent = nullptr);
void change();//自定义信号函数
signals:
void mySignals();//自定义槽函数
private:
QPushButton b;
};
#endif // ZIWIDGET_H
子窗口源文件
#include "ziwidget.h"
ZiWidget::ZiWidget(QWidget *parent) : QWidget(parent)
{
setWindowTitle("小弟");
b.setParent(this);
b.setText("切换到主窗口");
b.move(100,100);
resize(300,200);
connect(&b,&QPushButton::released,this,&ZiWidget::change);//按钮按下利用槽函数发送信号,由主窗口接收
}
void ZiWidget::change()
{
emit mySignals();//使用信号
}
主窗口头文件
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include "ziwidget.h"
#include <QWidget>
#include <QPushButton>
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = nullptr);
~MainWidget();
void change();
void change1();
private:
QPushButton b1;
ZiWidget w1;
};
#endif // MAINWIDGET_H
主窗口源文件
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle("老大");
b1.setParent(this);
b1.setText("切换到子窗口");
b1.move(100,100);
resize(300,200);//定义窗口大小
//w1.show();
connect(&b1,&QPushButton::released,this,&MainWidget::change);
connect(&w1,&ZiWidget::mySignals,this,&MainWidget::change1);//接收w1窗口的信号
}
void MainWidget::change()
{
hide();//隐藏当前窗口
w1.show();//显示子窗口
}
void MainWidget::change1()
{
show();//显示当前窗口
w1.hide();//隐藏子窗口
}
MainWidget::~MainWidget()
{
}