指定父对象和信号与槽
1.指定父对象
setWindowTitle
函数:
void setWindowTitle(const QString &)
参数:const QString &相当于string类型
作用:给窗口设置标题
setText
函数:
void setText(const QString &text)
参数:const QString &相当于string类型
作用:给按钮设置内容
- move函数:
void move(int x, int y)
参数:整形值,是一个坐标
作用:设定位置,比如按钮默认是在窗口的左上角,我们通过该函数改变按钮的位置
QWidget::setParent
函数:
void QWidget::setParent(QWidget *parent)
参数
:QWidget *parent传递一个窗口类型的指针
作用:指定父对象
什么叫指定父对象???
假设下面一种场景:
#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. 信号与槽
到这里基本功能已经了解,但是我们有了按钮,但是点击按钮并没有反应,此处就引出信号与槽。
信号:当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用
。槽:用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制
。
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. 自定义槽函数
自定义槽函数(和普通函数用法基本一致)
QT5的槽函数:任意的函数、普通全局函数、静态函数
槽函数需要和信号一致(参数,返回值)
由于信号是没有返回值的,所以槽一定是没有返回值的
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;
}