QT快速入门 学习笔记 第3,4,5(1)章

 如果定义如下:A *p则使用:p->play(); 左边是结构指针。A p 则使用:p.paly(); 左边是结构变量。箭头(->):左边必须为指针;点号(.):左边必须为实体。 /////////////////////////////////////////////////////单继承与多继承 //////////////////////...
摘要由CSDN通过智能技术生成

 

如果定义如下:

A *p则使用:p->play(); 左边是结构指针。

A p 则使用:p.paly(); 左边是结构变量。

箭头(->):左边必须为指针;

点号(.):左边必须为实体。

 

/

单继承与多继承

 

//

在类函数中创建一个dialog时使用

 

QDialog *dialog=new QDialog(this); 

  dialog->show();

dialog因为分配了新的内存空间所以不会用完就销毁,会一直存在,直到用delete销毁。

dialog1 只会存在一会儿,因为只在调用该函数时才存在故当函数调用完毕他也就随之被销毁

 

  QDialog dialog1(this);

  dialog1.show();

 

connect 是属于QObject类,包含四个参数,依次是发送信号的对象,发送的信号,接收信号的对象和要执行的槽。

 

///

 

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
   QMovie *movie=new QMovie("E:/timg.gif");
 
   ui->label_2->setMovie(movie);
   ui->label->setMovie(movie);
   QLabel *label1=new QLabel(this);
   label1->setMovie(movie);
    movie->start();
}

实现gif动图的程序,注意gif地址是 /  斜杠方向不是\,注意此处

///

  信号和槽是Qt应用开发的基础,它可是将两个毫无关系的对象连接在一起,槽和普通的C++函数是一样的,只是当它和信号连接在一起后,当发送信号的时候,槽会自动被调用。只有代码中加入了Q_OBJECT,你才能使用QT中的signal和slot机制。所有QObject的派生类在官方文档中都推荐在头文件中放置宏Q_OBJECT,那么该宏到底为我们做了哪些工作?在qobjectdef.h中有下面的代码。

对于explicit关键字,C++提供了关键字explicit,explicit构造函数是用来防止隐式转换的。阻止不应该进行的隐式转换的发生,声明为explicit的构造函数不可以进行隐式转换。 

一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。一个是个构造一个是对操作符默认隐含进行类型转换。我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象。这时候就要在这个构造器前面加上explicit修饰, 指定这个构造器只能被明确的调用/使用, 不能作为类型转换操作符被隐含的使用。
 

解析:

1,此关键字只能对用户自己定义的对象起作用,不对默认构造函数起作用,只能够修饰构造函数。而且构造函数的参数只能有一个。

2,何时用explicit?当我们不希望自动类型转换的时候用。其实标准库好多构造函数都是explicit的

比如说vector <int> ivec(10);  //这种定义看起来一目了然

不能写成vector <int> ivec=10;//此种定义让程序员感到疑惑

3,何时不用explicit?当我们需要隐式转换的时候不用。

比如说String类的一个构造函数

String(const char*);定义成这样的好处,在需要隐式转化的时候编译器会自动地帮我们转换,标准库里面的String就是一个好的证明。

具体来说:我们可以这样String str="helloworld";//直接调用构造函数

String str="hello"+str+"world";//调用重载的+操作符号

第二句的过程相当于:
String temp("hello"); //调用构造函数

String str=temp+str;

String t("world");//调用构造函数

String str=str+t;

明白隐式转换在操纵内存的类的时候很有用。

/

action头文件

#ifndef MYACTION_H
#define MYACTION_H
#include<QWidgetAction>
#include<QLineEdit>
#include<QSplitter>
#include<QLabel>
class QLineRdit;
class MyAction:public QWidgetAction
{
        Q_OBJECT
public:
    explicit MyAction(QObject *parent=0);
protected:
    QWidget *createWidget(QWidget *parent);
signals:
    void getText(const QString &string);
private slots:
    void sendText();
private:
    QLineEdit *lineEdit;
};
#endif // MYACTION_H
action的cpp文件
#include "myaction.h"
 
MyAction::MyAction(QObject *parent): QWidgetAction(parent)
{
    lineEdit=new QLineEdit;
    connect(lineEdit,SIGNAL(returnPressed()),this,SLOT(sendText()));
}
 
QWidget *MyAction::createWidget(QWidget *parent)
{
    if(parent->inherits("QMenu")||parent->inherits("QToolBar")){
        QSplitter *splitter=new QSplitter(parent);
        QLabel *label=new QLabel;
        label->setText(tr("insert the text:"));
        splitter->addWidget(label);
        splitter->addWidget(lineEdit);
        return splitter;
    }
    return 0;
}
 
void MyAction::sendText()
{
    emit getText(lineEdit->text());
    lineEdit->clear();
}

///

文章出处:https://www.cnblogs.com/felix-wang/p/6212197.html

Qt中的类库有接近一半是从基类QObject上继承下来,信号与反应槽(signals/slot)机制就是用来在QObject类或其子类间通讯的方法。作为一种通用的处理机制,信号与反应槽非常灵活,可以携带任意数量的参数,参数的类型也由用户自定。同时其本身也是类型安全的,任何一个从QObject或其子类继承的用户类都可以使用信号与反应槽。

信号的作用如同Windows系统中的消息。在Qt中,对于发出信号的对象来说,它并不知道是谁接收了这个信号。这样的设计可能在某些地方会有些不便,但却杜绝了紧耦合,于总体设计有利。反应槽是用来接收信号的, 但它实际上也是普通的函数,程序员可以象调用普通函数一样来调用反应槽。与信号类似的是,反应槽的拥有者也不知道是谁向它发出了信号。在程序设计过程中,多个信号可以连接至一个反应槽,类似的,一个信号也可以连接至多个反应槽,甚至一个信号可以连接至另一个信号。

在Windows中,如果我们需要多个菜单都激发一个函数,一般是先写一个共用函数,然后在每个菜单的事件中调用此函数。在Qt中如果要实现同样的功能,就可以把实现部分写在一个菜单中,然后把其他菜单与这个菜单级联起来。

虽然信号/反应槽机制有很多优点,使用也很方便,但它也不是没有缺点。最大的缺点在于要稍微牺牲一点性能。根据Trolltech公司的自测,在CPU为Intel PentiumII 500 Mhz的PC机上,对于一个信号对应一个反应槽的连接来说,一秒钟可以调用两百万次;对于一个信号对应两个反应槽的连接来说,一秒钟可以调用一百二十万次。这个速度是不经过连接而直接进行回调的速度的十分之一。请注意这里的十分之一速度比是调用速度的比较,而不是一个完整函数执行时间的比较。事实上一般情况下一个函数的总执行时间大部分是在执行部分,只有小部分是在调用部分,因些这个速度是可以接受的。这就象面向对象的编程和早些年的结构化编程相比一样:程序的执行效率并没有提高,反而是有所下降的,但现在大家都在用面向对象的方法编写程序。用一部分执行效率换回开发效率与维护效率是值得的,况且现在已是P4为主流的时代。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值