标签搜索

目 录CONTENT

文章目录

指定父对象和信号与槽.md

小小城
2021-08-22 / 0 评论 / 0 点赞 / 6 阅读 / 4,850 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

指定父对象和信号与槽

@[toc]

1.指定父对象

  1. setWindowTitle函数:
void setWindowTitle(const QString &)

参数:const QString &相当于string类型
作用:给窗口设置标题

  1. setText函数:
void setText(const QString &text)

参数:const QString &相当于string类型
作用:给按钮设置内容

  1. move函数:
void move(int x, int y)

参数:整形值,是一个坐标
作用:设定位置,比如按钮默认是在窗口的左上角,我们通过该函数改变按钮的位置

  1. QWidget::setParent函数:
void QWidget::setParent(QWidget *parent)

参数QWidget *parent传递一个窗口类型的指针
作用:指定父对象

  1. 什么叫指定父对象???
    假设下面一种场景:
#include <QApplication>
#include <QWidget>//窗口基类
#include <QPushButton>//按钮类

int main(int argc,char* argv[])
{
    QApplication app(argc,argv);//定义一个Qt应用程序对象

    QWidget w;//定义一个窗口对象
    w.setWindowTitle("hello QT!!!");//给窗口设置标题
    w.show();//显示窗口

    QPushButton b;//定义一个按钮
    b.setText("is me");//给按钮设置内容
    
    b.show();//显示按钮
    app.exec();//循环执行
    return 0;
}

a.如果没有指定父对象,对象和对象(窗口和窗口)之间没有任何关系,你会发现你的窗口和按钮分别是两个窗口,我们的目的是把按钮放在窗口当中,所以此处就需要指定父对象,将按钮放在窗口当中。
b.指定父对象的规则:a指定b为它的父对象,就将a放在b的上面
c.指定父对象的方法:1).setParent;2).通过构造函数传参
d.指定父对象后只需要父窗口显示,按钮就不需要show了

#include <QApplication>
#include <QWidget>
#include <QPushButton>

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

    QWidget w;
    w.setWindowTitle("hello QT!!!");

    QPushButton b;
    b.setText("is me");
    b.setParent(&w);//通过setParent函数指定父对象
    b.move(100,100);

	QPushButton b1(&w);//通过构造函数指定父对象
    b1.setText("also me");
    b1.move(80,80);

    w.show();
    app.exec();
    return 0;
}

在QT中,父对象/父窗口/父控件是一个意思,子对象/子窗口/子控件是一个意思

2.信号与槽

1. 梳理一下基本流程:
main.cpp中:

#include "mainwidget.h"
#include <QApplication>

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

    return a.exec();
}

程序先执行QApplication a(argc, argv);完成引用程序基类的构造,再执行 MainWidget w;完成窗口对象的构造,再执行w.show();,显示主窗口,最后执行return a.exec();阻塞等待用户的操作。

2. 一些注意事项

a. 这就是main函数的基本框架,我们用户自定义的功能都是在w这个派生类的构造函数当中完成
b.一种错误的代码:
mainwidget.cpp:

#include "mainwidget.h"
#include <QPushButton>


MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
	QPushButton b1;
    b1.setParent(this);
    b1.setText("b1");
    b1.move(10,10);
}

MainWidget::~MainWidget()
{
}

你们决定这个程序会在窗口上显示b1按钮吗???答案是不会,因为b1是构造函数的局部变量,出了这个作用域后就被销毁,即执行完MainWidget w; 后就销毁b1对象,还没来的及执行w.show();,所以不会显示b1按钮。
c.注意QT中的指针是必须要new对象的,否则就会出错。
mainwidget.h:

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include <QPushButton>

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = 0);
    ~MainWidget();
private:
    QPushButton b1;
    QPushButton* b2;
};

#endif // MAINWIDGET_H

mainwidget.cpp:

#include "mainwidget.h"

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("b1");
    b1.move(10,10);

    //b2->serParent(this);
    b2 = new QPushButton(this);
    b2->setText("b2");
    b2->move(99,99);
}

MainWidget::~MainWidget()
{
    delete b2;
}

3. 信号与槽

到这里基本功能已经了解,但是我们有了按钮,但是点击按钮并没有反应,此处就引出信号与槽。

  1. 信号:当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用
  2. 槽:用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制

4. connect函数:

bool QObject::connect ( const QObject * sender, const char * signal, 
		 const QObject * receiver, const char * member ) [static]
参数解释
const QObject * sender信号谁发出的
const char * signal发出什么信号 ,发送者的类名::信号的名字
const QObject * receiver谁接收
const char * member接受者干啥,信号处理函数,接受者的类名::槽函数名字
函数的作用连接信号与槽,当信号发出者发出一个信号后,由接收者接收,当该信号被触发时,接收者执行信号处理函数
#include "mainwidget.h"

//该函数的功能是当按下的时候发生的,接收者的处理是关闭窗口
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("close");
    b1.move(10,10);
    
    //QPushButton::pressed:代表发送者发送的信号
    //MainWidget::close:代表接收者执行的动作
    /*[signal] void QAbstractButton::pressed()
	This signal is emitted when the button is pressed down.
	See also released() and clicked().*/
    connect(&b1,&QPushButton::pressed,this,&MainWidget::close);
}

MainWidget::~MainWidget()
{
    delete b2;
}

5. 自定义槽函数

  1. 自定义槽函数(和普通函数用法基本一致)
  2. QT5的槽函数:任意的函数、普通全局函数、静态函数
  3. 槽函数需要和信号一致(参数,返回值)
  4. 由于信号是没有返回值的,所以槽一定是没有返回值的

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include <QPushButton>

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = 0);
    ~MainWidget();
    void MySolt();//自定义槽函数声明
private:
    QPushButton b1;
    QPushButton* b2;
};

#endif // MAINWIDGET_H

mainwidget.cpp

#include "mainwidget.h"

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("close");
    b1.move(10,10);

    //b2->serParent(this);
    b2 = new QPushButton(this);
    b2->setText("99999");
    b2->move(99,99);

	/*void QAbstractButton::released()
	This signal is emitted when the button is released.
	void QWidget::hide()
	Hides the widget. This function is equivalent to setVisible(false).
	Note: If you are working with QDialog or its subclasses and you 				invoke the show() function after this function, the dialog will be 	
	displayed in its original position.*/

	//关联b2按钮和主窗口,当按钮抬起时执行MySolt自定义槽函数
    connect(b2,&QPushButton::released,this,&MainWidget::MySolt);
    //关联b2按钮和b1按钮,当按钮抬起时执行hide槽函数
    connect(b2,&QPushButton::released,&b1,&QPushButton::hide);
}

void MainWidget::MySolt()//自定义槽函数实现
{
	//将b2按钮当中的内容换为666
    b2->setText("6666");
}

MainWidget::~MainWidget()
{
    delete b2;
}

0

评论区