QT信号与槽及其附属知识点

QT常用函数概述

  • setWindowTitle("string"): 设置标题

  • setText("string"):给按钮设置内容

  • setParent(&父对象):设置父对象

  • 构造函数传参:设置父对象(只需要父对象显示,其子对象自动显示)

  • move(x, y):以左上角为坐标原点,移动x, y

  • show:显示对象所属控件

  • exec:进程一直显示,等待用户操作

  • connect(&b1, &QPushButton::pressed, this, &MainWidget::close)

    1. &b1: 信号发出者,指针类型

    2. &QPushButton::pressed:处理的信号,&发送者的类名::信号的名字

    3. this:信号接收者

    4. &MainWidget::close: 槽函数,信号处理函数 &接收的类名::槽函数名字(接收对象在接收到信号之后所需要调用的函数)

  • disconnect:断开信号和槽的连接

  • hide:对象所属控件隐藏

  • resize(x, y):重新界定子窗口大小

  • move(x, y):相对于父窗口,子窗口移动(x, y)

  • setGeometry(x1, y1, x2, y2):(x1, y1)为框的位置,(x2, y2)为框的大小

  • menuBar:添加菜单栏

  • addMenu:添加菜单

  • addAction:添加菜单项,添加动作

  • addSeparator:添加分割线

  • addToolBar("toolBar"):添加菜单栏快捷方式

  • statusBar():新建状态栏

  • QLabel:新建标签

  • addWidget:从左往右添加状态栏

  • addPermanentWidget:从右往左添加状态栏

  • QTextEdit:新建文本编辑框

  • setCentralWidget:为文本编辑框添加文本编辑功能

  • setWidget:给对应窗口设置文本编辑

    例如:this->setWidget(textEdit);给当前窗口设置文本编辑

  • QMessageBox::about:创建关于对话框

  • QMessageBox::question:创建问题对话框

  • setCurrentIndex:切换页

  • setTextMargins:设置外边距(设置内容显示间隙)

  • setEchoMode:设置内容显示方式

按钮,框函数

  • triggered

  • pressed

  • clicked

功能好像一样QAQ


QT头文件

  • QPushButton:按钮

  • QMenuBar:菜单(用于添加菜单栏)

  • QMenu:菜单(添加菜单)

  • QAction:添加菜单项(添加动作)

  • QDebug:打印

  • QToolBar:添加菜单项的快捷方式

  • QStatusBar:状态栏

  • QLabel:标签

  • QTextEdit:文本编辑框(也称核心控件)

  • QDockWidget:浮动窗口

  • QDialog:模态对话框

  • QMessageBox:对话框

  • QFileDialog:文件对话框

    示例:

        QAction *p5 = menu->addAction(QString::fromLocal8Bit("文件对话框"));
        connect(p5, &QAction::triggered,
            [=]()
            {
                QString path = QFileDialog::getOpenFileName(
                            this,
                            "open",
                            "../",//打开文件对话框的位置(命令行)
                            "source(*.cpp *.h);;Text(*.txt);;All(*.*)"//文件类型
                            );
                qDebug()<<path;
            }
            );
    
  • QStringList:字符串列表

  • QCompleter:字符表达形式???

  • QMovie:gif动画


信号与槽

概述

信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。(这里提一句,Qt 的信号槽使用了额外的处理来实现,并不是 GoF 经典的观察者模式的实现方式。)

信号和槽是Qt特有的信息传输机制,是Qt设计程序的重要基础,它可以让互不干扰的对象建立一种联系。

槽的本质是类的成员函数,其参数可以是任意类型的。和普通C++成员函数几乎没有区别,它可以是虚函数;也可以被重载;可以是公有的、保护的、私有的、也可以被其他C++成员函数调用。唯一区别的是:槽可以与信号连接在一起,每当和槽连接的信号被发射的时候,就会调用这个槽。

自定义槽

  1. QT5:任意的成员函数,普通全局函数,静态函数

  2. 槽函数需要与信号一致(参数类型和参数个数一致)

  3. 由于信号都是没有返回值,所以,槽函数一定没有返回值


额外知识点

  • emit:意为发送,主要用于发送信号

  • signals:

    1. 信号必须有signals关键字来声明

    2. 信号没有返回值,但可以有参数

    3. 信号就是函数的声明,只需声明,无需定义

    4. 使用:emit mySignal();

  • 在发送带参数的命令时,字符串包含中文的话,如果报错,请参照QT中提示“常量中h有换行符”解决办法 一文

  • 重载信号用函数指针

例如

    void (SubWidget::*funSignal)()=&SubWidget::mySignal;
    void (SubWidget::*testSignal)(int, QString)=&SubWidget::mySignal;
    connect(&subWin, funSignal, this, &MainWidget::dealSub);
    connect(&subWin, testSignal, this, &MainWidget::dealSolt);

  • 打印由Unicode编码转中文
    //str.toUtf8() -> 字节数组QByteArray
    //...data() -> QByteArray -> char *
    qDebug()<<a<<str.toUtf8().data();
    //高版本可以直接用第二种方式

    //高版本QT可以直接打印中文
    qDebug()<<a<<str;
  • Lambda表达式:

    1. 匿名函数对象

    2. C++11增加的新特性,项目文件:CONFIG += C++11

    3. QT配合信号一起使用

    例如

    int a=10, b=100;
    connect(b4, &QPushButton::released,
            // = :把外部局部变量、类中所有成员以值传递方式
            // this: 类中所有成员以值传递方式
            // & :把外部所有局部变量(除类中定义的)
            [=]() mutable   //将值传递的变量设为可改变
            {
                b4->setText("123");
                qDebug()<<"1111";
                qDebug()<<a<<b;
                a=11;
            }
            );
    
    

内存回收机制

  • 1)指定父对象后 2)直接或间接继承于QObject

  • 子对象如果是动态分配空间的new,不需要手动释放delete

  • 系统会自动释放

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容