如果定义如下:
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为主流的时代。