Qt学习笔记:第一天 信号与槽函数 主窗口与子窗口

Qt笔记第一天

首先,进行Qt的安装与配置,参考网上的教程完成即可。

解释:.pro文件

QT       += core gui	//模块的名字
	greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

	TARGET = test	//应用程序名
	TEMPLATE = app	//生成的makefile的模板类型

	//源文件
	SOURCES += main.cpp\
       		 mainwindow.cpp

	//头文件
	HEADERS  += mainwindow.h

	//窗口设计文件
FORMS    += mainwindow.ui

.pro是工程文件 是qmake自动生成的用于生产makefile的配置文件

'#'是注释的意思

最简单的一个Qt小窗口是:

#include <QApplication>
	#include <QWidget>

	int main(int argc, char *argv[])
	{
  	  	QApplication a(argc, argv);
  	  	QWidget w;
  	  	w.show();

  	  	return a.exec();
}

a.exec( ) 进入消息循环,短暂暂停,显示给用户或等待用户操作。

信号与槽
#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QPushButton button("Quit");
QObject::connect(&button, &QPushButton::clicked,
&app, &QApplication::quit);
    button.show();
    return app.exec();
}

connect的基本写法是

connect(sender, signal, receiver, slot);

可以通过自定义信号或自定义槽函数的方法,进行操作。

其中如果是在UI界面中画出来的按钮,如果slot函数的名称为on_pushButton_1_clicked()则可以省去connect函数

学习代码如下

signalslotswidget.h文件:

#ifndef SIGNALSLOTSWIDGET_H
#define SIGNALSLOTSWIDGET_H

#include <QWidget>
#include <QPushButton>

QT_BEGIN_NAMESPACE
namespace Ui { class signalslotsWidget; }
QT_END_NAMESPACE

class signalslotsWidget : public QWidget
{
    Q_OBJECT

public:
    signalslotsWidget(QWidget *parent = nullptr);
    ~signalslotsWidget();
    QPushButton b1;
    int num = 999;
public slots:
    void on_b1_clicked();
    void on_pushButtonADD_clicked();
    void on_pushButtonSUB_clicked();

private:
    Ui::signalslotsWidget *ui;
};
#endif // SIGNALSLOTSWIDGET_H

signalslotswidget.cpp文件:

#include "signalslotswidget.h"
#include "ui_signalslotswidget.h"
#include <QPushButton>
#include <QLCDNumber>
signalslotsWidget::signalslotsWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::signalslotsWidget)
{
    ui->setupUi(this);
    // 使用指针 创建按钮 点击按钮 发出信号 调用函数 关闭窗口
    // 使用qt5写法数学connect函数 调用系统方法

    QPushButton *b0 = new QPushButton(this);
    b0->setText("click to close");
    b0->resize(150, 30);
    b0->move(150, 150);
    // 写出连接函数 将按钮产生的clicked信号与窗体关闭的系统槽函数 close()相连接
    // 当点击按钮时 自动调用关闭整个窗口

    // connect四个参数 sender发送者指针 signal信号指针 receiver接收者指针 slot槽函数
    connect(b0, &QPushButton::clicked, this, &signalslotsWidget::close);
    // 上述事例用的是系统信号和系统槽函数
    // 使用自定义槽函数
    // 需要在.h中声明 槽函数(slots) 在.cpp中实现槽函数


    b1.setParent(this);// 没有设置父对象 无法显示
    b1.resize(120,30);
    b1.move(50, 150);
    b1.setText(":)");
    // 连接b1信号和slots
    connect(&b1, &QPushButton::clicked, this, &signalslotsWidget::on_b1_clicked);



    ui->lcdNumber->display(num);
    connect(ui->pushButtonAdd, &QPushButton::clicked, this, &signalslotsWidget::on_pushButtonADD_clicked);
    connect(ui->pushButtonSub, &QPushButton::clicked, this, &signalslotsWidget::on_pushButtonSUB_clicked);

    // 自定义信号 自定义带参数信号

}

signalslotsWidget::~signalslotsWidget()
{
    delete ui;
}

void signalslotsWidget::on_b1_clicked() // 类的外联函数实现方法
{
    b1.setText("^_^");
}

void signalslotsWidget::on_pushButtonADD_clicked()
{
    ui->lcdNumber->display(++num);
}

void signalslotsWidget::on_pushButtonSUB_clicked()
{
    ui->lcdNumber->display(--num);
}

//void signalslotsWidget::on_pushButtonAdd_clicked()
//{
//    // 不能直接++num ++的话num会变 但是display的值还是原始的值
//    // ui控件设计的时候 如果在头文件中 槽函数命名与控件名一致 会生成默认槽函数 自动连接 不必写connect
//    //    ui->lcdNumber->display(++num);
//}

//void signalslotsWidget::on_pushButtonSub_clicked()
//{
//    //    ui->lcdNumber->display(--num);
//}

打开多个窗口:

subwidget.h文件

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QString>

class subWidget : public QWidget
{
    Q_OBJECT
public:
    explicit subWidget(QWidget *parent = nullptr);
    QPushButton *b3;
signals:
    /*
    signals关键字,用于自定义信号
    信号没有返回值,但是可以带参数,参数可以不只一个
    信号其实就是一个函数声明,不用实现,只用声明
    使用emit关键字,进行信号的发送
    信号可以重载(同一函数名,多种不同参数表)
*/
    void signalToMain();
    void signalToMainWithArg(int, QString);
public slots:
    void on_b3_clicked();
};

#endif // SUBWIDGET_H

subwidget.cpp文件:

#include "subwidget.h"

subWidget::subWidget(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("subWin");
    this->resize(800,600);
    b3 = new QPushButton(this);
    b3->setParent(this);
    b3->setText("changetoMainWin");
    connect(b3,&QPushButton::clicked,this,&subWidget::on_b3_clicked);
}

void subWidget::on_b3_clicked()
{
    //通过按钮信号调用槽函数,向主窗口发送信号
    emit signalToMain();
    //信号可以带参数
    emit signalToMainWithArg(250,"我是子窗口发来的带参信号");
}

main.cpp:

#include "changwidget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    changWidget w;
    w.show();
    return a.exec();
}

changewidget.h

#ifndef CHANGWIDGET_H
#define CHANGWIDGET_H

#include <QWidget>
#include "subwidget.h"
#include <QPushButton>

QT_BEGIN_NAMESPACE
namespace Ui { class changWidget; }
QT_END_NAMESPACE

class changWidget : public QWidget
{
    Q_OBJECT

public:
    changWidget(QWidget *parent = nullptr);
    ~changWidget();
    QPushButton *b1;
    QPushButton *b2;
public slots:
    void on_buttonchange_clicked();
    void on_subWin_received();
    void on_subWin_receivedWithArg(int, QString);
private:
    Ui::changWidget *ui;
    subWidget subwin;
};
#endif // CHANGWIDGET_H

changewidget.cpp:

#include "changwidget.h"

#include "ui_changwidget.h"
#include <QDebug>

changWidget::changWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::changWidget)
{
    ui->setupUi(this);
    this->setWindowTitle("mainWin");
    b1 = new QPushButton(this);
    b2 = new QPushButton(this);
    b1->setText("close");
    b2->setText("changetoSubWin");
    b1->move(200,50);
    b2->move(100,50);

    connect(b1,&QPushButton::clicked,this,&changWidget::close);
    connect(b2,&QPushButton::clicked,this,&changWidget::on_buttonchange_clicked);
    //subwin.show();

    connect(&subwin,&subWidget::signalToMain,
            this,&changWidget::on_subWin_received);

    connect(&subwin,&subWidget::signalToMainWithArg,
            this,&changWidget::on_subWin_receivedWithArg);
}

changWidget::~changWidget()
{
    delete ui;
}

void changWidget::on_buttonchange_clicked()
{
    //显示子窗口然后隐藏主窗口
    subwin.show();
    this->hide();
}

void changWidget::on_subWin_received()
{
    //隐藏子窗口,显示主窗口
    subwin.hide();
    this->show();
}

void changWidget::on_subWin_receivedWithArg(int a, QString str)
{
    qDebug() << a << str;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,窗口调用窗口函数可以通过信号机制来实现。 首先,在窗口类中定义一个需要被窗口调用函数。例如,窗口类为ChildWindow,函数为childFunction()。 窗口头文件ChildWindow.h中添加以下代码: ```cpp signals: void callChildFunction(); public slots: void childFunction(); ``` 接下来,在窗口类中,需要实例化窗口的对象,并连接窗口信号窗口函数窗口头文件MainWindow.h中添加以下代码: ```cpp private slots: void onCallChildFunction(); ``` 窗口源文件MainWindow.cpp中添加以下代码: ```cpp void MainWindow::onCallChildFunction() { childWindow->childFunction(); } ``` 最后,在窗口类的构造函数中,进行窗口对象的创建,并连接信号函数窗口源文件MainWindow.cpp中添加以下代码: ```cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { // 其他代码... childWindow = new ChildWindow(this); connect(this, &MainWindow::callChildFunction, childWindow, &ChildWindow::childFunction); } ``` 这样,当窗口需要调用窗口函数时,只需要在窗口函数onCallChildFunction()中发射信号emit callChildFunction()即可。 总结起来,窗口调用窗口函数的步骤如下: 1. 在窗口类中定义需要被调用函数。 2. 在窗口类中创建窗口对象,并连接信号函数。 3. 在窗口类的函数中发射窗口信号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值