Qt C++自定义Qt组件

  • 如果我们要自定义组件,最好还是在主函数以外的地方执行,这种思想是:一切自定义的控件,其属性,行为等都应该在窗口初始化的时候完成
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;//构造函数----执行窗口初始化
    w.show();

    return a.exec();
}

信号:

遭遇中断,执行程序决定是否停下来,处理信号

槽函数:

一句话-------信号与槽是Qt控件之间通信的接口

信号接收到之后,用于处理信号的函数

Qt的核心思想是信号与槽,那么基本操作方法是调用connect(a,b,c,d)函数通过相关控件,发送信号,并指定信号的接受者,给接收者委派处理信号的函数

具体操作步骤

  1. 定义发送信号的控件(connect函数参数列表的第一个参数,数据类型为指针)
  2. 控件执行什么动作时发送信号(Qt官方为控件定义的信号,其检索方式见番外篇)
  3. 定义信号的接收者(通常也是指针)
  4. 处理信号时调用的函数(槽函数简称槽)
connect(qb,&QPushButton::pressed,this,&mywidget::close);

丁大锅定义的控件

  • 创建项目--仅列出关键步骤

 

 

 

 

 

 class name可以随便取,我决定改成mywidget

  • 项目文件构成

 

 

  •  定义窗体的控件为窗体类的私有属性,---否则运行窗体时会出现控件不出现的情况 这需要在窗体类的头文件中完成定义
#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include<QPushButton>
class mywidget : public QWidget
{
    Q_OBJECT

public:
    mywidget(QWidget *parent = 0);
    ~mywidget();
private:
    QPushButton *qb;//这就是稍后发送信号的主角,这里声明为指针
};

#endif // MYWIDGET_H

 

  • 按照文章开头提出的规划,自定义的控件都要在初始化的时候完成,那么在窗体类的实现文件mywidget.cpp中
#include "mywidget.h"
#include <QPushButton>
mywidget::mywidget(QWidget *parent)
    : QWidget(parent)
{
    this->setGeometry(QRect(100,200,600,400));
    this->setWindowTitle(QString("昌仔和我"));
    qb=new QPushButton(this);

    qb->setText("喜欢昌仔");
    qb->move(20,20);
    qb->show();
    connect(qb,&QPushButton::pressed,this,&mywidget::close);
}

mywidget::~mywidget()
{

}

输出结果

 

 效果:一点击 按钮 窗体就会关闭

 

  • 番外篇----connect()函数里的信号怎么选择
以QPushButton为例,我们希望在点击按钮后,由窗体接受信号,窗体处理这个信号时调用了槽函数close,那么我们如何找到Qt官方为点击按钮所写的信号呢

我们把光标放在控件所树的类名处点击F1

 

 你的IDE会出现,(如果再次按下F1,右边的官方文档会挤占编辑器的界面空间)

 

 我们要检索signal(),显然,QPushButoon中我们并没有找到signal()的用法及其说明

这并不意味着该控件没有signal信号的用法,而是可能在QPushButton的父类中

 

 

 inherits,表示继承自哪个控件,点击链接

接下来,你按图索骥就是了,点击signal,检索出多个signal,点击查看,按需索取即可。

 

 

connect(qb,&QPushButton::pressed,this,&mywidget::close);
父类中存在的方法,子类中一定存在

 

posted @ 2020-02-02 14:47  saintdingtheGreat  阅读(797)  评论(0编辑  收藏  举报