Qt信号与槽函数(QT二)

8 篇文章 2 订阅

一、信号与槽函数

Qt自带的一种通信机制

按钮的部分内置信号有

Signals
void clicked(bool checked = false)
void pressed()
void released()
void toggled(bool checked)

例如设置点击按钮时关闭窗口

当button按钮被点击的时候会发送 clicked信号

窗口要在点击按钮时候关闭 -> 窗口接受按钮发送的信号并且调用关闭窗口的槽函数

按钮发送信号,窗口接收后调用关闭槽函数

QPushButton自带clicked信号, MainWindow中自带close槽函数

//把按钮的点击clicked信号窗口(this)的close槽函数关联
connect(ui->bt,&QPushButton::clicked, this, &MainWindow::close);

1.自定义槽函数

private slots://自定义槽函数
    void myprint();  //槽函数声明----必须要实现
void MainWindow::myprint() //槽函数实现
{
    qDebug()<<"hello world";
}
把printBt按钮的信号与槽函数myprint关联
connect(ui->printBt,&QPushButton::clicked,this, &MainWindow::myprint);

Qt中调试输出类

#include <QDebug>
qDebug()<<"hello";

获取输入框中的内容转为数值–计算–转为字符串QString显示

    QString first = ui->firstNum->text();
    QString second = ui->secondNum->text();
    ui->label->setText("+");

    //把字符串转数值在进行计算
    double result = first.toDouble()+second.toDouble();
    //结果显示--把数值result转字符串
    ui->result->setText(QString::number(result));

2.自定义信号

(1)信号声明

signals:
    void mysignal();//自定义信号---不需要实现
信号发送
void MainWindow::mybutton_fun()
{
    qDebug()<<"槽函数1";
    //发送信号---
    emit mysignal();
}

(2)自定义信号和发送例子

mainwindow.h

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    void mybutton_fun();//槽函数1
    void selfbutton_fun();//槽函数2
signals:
    void mysignal();//自定义信号---不需要实现
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //把按钮的clicked信号关联mybutton_fun槽函数
    connect(ui->button, &QPushButton::clicked,this, &MainWindow::mybutton_fun);
    //把mysignal信号与selfbutton_fun槽函数关联
    connect(this, &MainWindow::mysignal, this, &MainWindow::selfbutton_fun);
}

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

void MainWindow::mybutton_fun()
{
    qDebug()<<"槽函数1";
    //发送信号---
    emit mysignal();
}

void MainWindow::selfbutton_fun()
{
    qDebug()<<"槽函数2";
}

3.界面切换

打开一个界面,点击按钮后打开第二个界面;在第二个界面中点击close按钮关闭界面,点击next按钮打开第三个界面;在第三个界面中点击back返回第二个界面。

注意:在创建多个界面时,所有的界面必须都继承QMainWindows

(1)从firstWin -> secondWin 不需要返回

void FirstWin::on_nextBt_clicked()
{
    SecondWin *win = new SecondWin;
    win->show();
    //把第一个界面给销毁
    this->close();
}

(2)从secondWin -> thirdWin需要返回

void SecondWin::on_nextBt_clicked()
{
    //创建第三个界面
    ThirdWin  *win = new ThirdWin(this);
    win->show();
    this->hide();//隐藏第二个界面
}

(3)从thirdWin -> SecondWin

void ThirdWin::on_prevBt_clicked()
{
            //返回到第二个界面
            this->parentWidget()->show();
            delete this;//第三个界面释放
}

(4)优化

为防止使用者在中途关闭界面,可采用一下方式隐藏关闭按钮(一下方式二选一即可)

//全屏显示
this->showFullScreen();
//标题栏隐藏
this->setWindowFlag(Qt::FramelessWindowHint);

4.界面间参数传递

创建两个界面,在第一个界面中输入内容后,点击按钮,将输入的内容发送到第二界面显示,第二个界面同理。

注意:在创建多个界面时,所有的界面必须都继承QMainWindows

(1)firstwin类

class firstwin : public QMainWindow
{
    Q_OBJECT

public:
    firstwin(QWidget *parent = nullptr);
    ~firstwin();

private slots:
    void on_nextbt_clicked();

    void on_nextbt_2_clicked();

    void recvdata(QString data);

private:
    Ui::firstwin *ui;
    secondwin *win;
};

(2)secondwin类

class secondwin : public QMainWindow
{
    Q_OBJECT

public:
    explicit secondwin(QWidget *parent = nullptr);
    ~secondwin();
    void setdata(QString data);
private slots:
    void on_backbt_clicked();
signals:
    void senddata(QString data);
private:
    Ui::secondwin *ui;
    QString fromfirstdata;
};

(3)firstwin.cpp

#include "firstwin.h"
#include "ui_firstwin.h"
#include "secondwin.h"

firstwin::firstwin(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::firstwin)
{
    ui->setupUi(this);
    win = nullptr;

}

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


void firstwin::on_nextbt_clicked()
{
    QString data = ui->line->text();

    if(win == nullptr)
    {
        win = new secondwin(this);
        connect(win,&secondwin::senddata,this,&firstwin::recvdata);
    }
    win->setdata(data);
    win->show();
    this->hide();
}

void firstwin::on_nextbt_2_clicked()
{
    this->close();
}

void firstwin::recvdata(QString data)
{
    ui->label->setText(data);
}

(4)secondwin.cpp

#include "secondwin.h"
#include "ui_secondwin.h"

secondwin::secondwin(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::secondwin)
{
    ui->setupUi(this);
}

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

void secondwin::setdata(QString data)
{
    this->fromfirstdata = data;
    ui->label->setText(fromfirstdata);
}

void secondwin::on_backbt_clicked()
{
    QString data = ui->line->text();
    emit senddata(data);
    this->parentWidget()->show();
    delete this;
}

5.样式

(1)组件样式设置

在ui文件设计中,右击QMainWindows,点击改变样式表

①改变所有同类型组件的样式

组件类型{
	设置想要改变的样式;
}

例:

QPushButton
{
	color:green;//设置字体颜色
	border:12px solid#123456;//设置边界宽度和颜色
	background-color:red;//设置背景颜色
}

②改变某个组件的样式

组件类型#组件名{
	设置想要改变的样式;
}

例:

QPushButton#firstbt
{
	color:green;
	border:12px solid#123456;
	background-color:red;
}

(2)在组件上显示图片

①新建Qt Resource File
在这里插入图片描述
新建完成后生成.qrc

②添加前缀
在这里插入图片描述
③添加图片文件
在这里插入图片描述
④进入改变样式表,选择添加资源
在这里插入图片描述
⑤选择你想要添加的图片即可

  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java.L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值