QMainWindow QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menubar)、多个工具栏(toolbars)、多个停靠部件(dockwidgets)、一个状态栏(statusbar)及一个中心部件(centralwidget),是许多应用程序的基础,如文本编辑器,图片编辑器等。 菜单栏 一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。 通过QMainWindow类的menubar()函数获取主窗口菜单栏指针,如果当前窗口没有菜单栏,该函数会自动创建一个。QMenuBarmenuBar=w.menuBar();//获取主窗口的菜单栏指针 创...
信号与槽函数 在Qt中,信号(Signals)和槽(Slots)是用于对象间通信的一种机制,是Qt中事件处理和消息传递的重要方式。信号和槽机制使得对象之间的通信更加灵活和方便,同时也实现了很好的解耦。 当某个事件发生后,如某个按钮被点击了一下,它就会发出一个被点击的信号(signal)。 某个对象接收到这个信号之后,就会做一些相关的处理动作(称为槽slot)。 但是Qt对象不会无故收到某个信号,要想让一个对象收到另一个对象发出的信号,这时候需要建立连接(connect) 在Qt中,有一种回调技术的替代方法:那就是信号和槽机制。当特定事件发生时,会发出一个信号。Qt的小部件中有许多预定义的信号,...
Qt_2 小部件是GUI的基本元素。它也称为UI控件。它接受来自底层平台的不同用户事件,如鼠标和键盘事件(以及其他事件)。我们使用不同的小部件创建UI。曾经有一段时间,所有的GUI控件都是从头开始编写的。Qt小部件通过开发具有现成的GUI控件的桌面GUI来缩短时间,并且Qt广泛使用继承的概念。所有小工具都继承自QObject。QWidget是一个基本小部件,是所有UI小部件的基类。它包含描述小部件所需的大多数属性,以及几何图形、颜色、鼠标、键盘行为、工具提示等属性。让我们看看下图中的QWidget继承层次结构: 大多数Qt小部件名称都是不言而喻的,因为它们以q开头,所以很容易识别。下面列出了...
Qt_1 QtCreator是Qt公司生产的IDE。它集成了多个工具,包括代码编辑器、图形UI(GUI)设计器、编译器、调试器、Qt设计器、Qt快速设计器和Qt助手等。 QtDesigner帮助设计基于小部件的GUI,而QtQuickDesigner提供了在设计模式下创建和编辑基于QML的GUI的UI。Qt助手是一个集成的文档查看器,只需按F1键即可打开与给定Qt类或函数相关的内容。 您可以在UI中看到以下GUI部分: IDE菜单栏:这为用户提供了一个在窗口中查找大多数特定于应用的功能的标准位置。这些功能包括创建项目、打开和关闭文件、开发工具、分析选项、帮助内容以及退出程序的方式。 模式...
类模板应用 explicit explicit是一个关键字,用于指定该构造函数是显式构造函数。在C中,当一个类的构造函数只有一个参数时,它可以被用于隐式类型转换,这可能会导致意想不到的行为和潜在的错误。为了避免这种情况,可以使用explicit关键字来声明该构造函数,表示禁止隐式类型转换,只能显式地调用该构造函数来创建对象。 include<iostream> classMyClass{ public: explicitMyClass(intx){ std::cout<<"Explicitconstructorcalledwith"<<x<<s...
class_template 类模板和函数模板的定义和使用类似,我们已经进行了介绍。有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同。类模板用于实现类所需数据的类型参数化 template<classNameType,classAgeType> classPerson { public: Person(NameTypename,AgeTypeage) { this->mName=name; this->mAge=age; } voidshowPerson() { cout<<"name:"<<this->mNa...
C_template c提供了函数模板(functiontemplate.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板。凡是函数体相同的函数都可以用这个模板代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。 c提供两种模板机制:函数模板和类模板 类属:类型参数化,又称参数模板 函数模板 函数模板是C中的一种特性,它允许你编写一个通用的函数,能够处理不同类型的数据,而不需要针对每种类型编写多个函数。通过函数模板,你可以编写一次代码,然...
系统调用 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。 从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。 系统服务之所以需要通过系统调用来提供给用户空间的根本原因是为了对系统进行“保护”,因为我们知道Linux的运行空间分为内核空间与用户空间,它们各自运行在不同的级...
dynamic_memory 首先通过一段代码来引入动态内存分配的主题。一个名为StringBad的类以及一个功能更强大的String类。 include<iostream> ifndefSTRNGBAD_H_ defineSTRNGBAD_H_ classStringBad{ private: charstr; intlen; staticintnum_strings; public: StringBad(constchars); StringBad(); StringBad(); friendstd::ostream&operator<<(s...
list 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相较于vector的连续线性空间,list就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移除,list永远是常数时间。 List和vector是两个最常被使用的容器。List容器是一个双向链表。 ...
deque Vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。 Deque容器和vector容器最大的差异,一在于deque允许使用常数项时间对头端进行元素的插入和删除操作。二在于deque没有容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来,换句话说,像vector那样,”旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”这样的事情在deque身上是不会发生的。...
stack&queue stack stack是一种先进后出(FirstInLastOut,FILO)的数据结构,它只有一个出口,形式如图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许有遍历行为。 有元素推入栈的操作称为:push,将元素推出stack的操作称为pop. stack没有迭代器 Stack所有元素的进出都必须符合”先进后出”的条件,只有stack顶端的元素,才有机会被外界取用。Stack不提供遍历功能,也不提供迭代器。 stack构造函数 stack stkT;//st...
vector vector的数据安排以及操作方式,与array非常相似,两者的唯一差别在于空间的运用的灵活性。Array是静态空间,一旦配置了就不能改变,要换大一点或者小一点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的数据搬往新空间,再释放原来的空间。Vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必害怕空间不足而一开始就要求一个大块头的array了。 Vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率,一旦vector旧空间满了,如果...
STL STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器、空间配置器。 数据结构和容器管理:STL提供了多种数据结构和容器,如向量(vector)、链表(list)、集合(set)、映射(map)等。这些容器可以帮助程序员方便地存储和管理数据,根据需求进行动态调整和操作。 算法和数据处理:STL中提供了大量的算法,如排序、查找、遍历等,这些算法可以直接应用于不同类型的容器,帮助程序员高效地对数据进行处理和操作。 迭代器和访问控制:STL中的迭代器提供了统一的访问接口,使得程序员能够方便地遍历容器中的元素并进行读写操作。迭代器可以灵活地控制访问...
polymorphism 静态联编和动态联编 多态性(polymorphism)提供接口与具体实现之间的另一层隔离,从而将”what”和”how”分离开来。多态性改善了代码的可读性和组织性,同时也使创建的程序具有可扩展性,项目不仅在最初创建时期可以扩展,而且当项目在需要有新的功能时也能扩展。 c支持编译时多态(静态多态)和运行时多态(动态多态),运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。 静态多态和动态多态的区别就是函数地址是早绑定(静态联编)还是晚绑定(动态联编)。如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态),就是说地址...
Class_memory 接上一篇末尾虚拟继承的简单介绍之后,这篇来详细讲一下这个内存大小是怎么分配的。 使用cl cl是MicrosoftVisualStudio中的C/C编译器命令。通过在命令行中键入cl命令,可以调用VisualStudio的编译器进行编译操作。cl命令提供了各种选项和参数,用于指定源文件、编译选项、输出目标等信息,从而进行编译过程。 cl/d1reportSingleClassLayoutBigBaseuseclub.cpp这是我们要查看内存使用的命令,具体的语法是 cl/d1reportSingleClassLayoutSSSSMMMM.cpp SSSS代表的是你想...
inheritance 在C中,继承是一种面向对象编程的特性,允许一个类(称为子类或派生类)从另一个类(称为基类或父类)那里继承属性和行为。通过继承,子类可以获得父类的数据成员和成员函数,从而可以重用父类的代码并扩展其功能。这样可以提高代码的复用性和可维护性,同时也符合面向对象编程的封装和抽象特性。 一个B类继承于A类,或称从类A派生类B。这样的话,类A成为基类(父类),类B成为派生类(子类)。 派生类中的成员,包含两大部分: 类是从基类继承过来的,一类是自己增加的成员。 从基类继承过过来的表现其共性,而新增的成员体现了其个性。 简单的类派生 CLUB.h ifndefCLUB_H def...
operator 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 在c中,可以定义一个处理类的新运算符。这种定义很像一个普通的函数定义,只是函数的名字由关键字operator及其紧跟的运算符组成。差别仅此而已。它像任何其他函数一样也是一个函数,当编译器遇到适当的模式时,就会调用这个函数。 定义重载的运算符就像定义函数,只是该函数的名字是operator@,这里的@代表了被重载的运算符。函数的参数中参数个数取决于两个因素。 运算符是一元(一个参数)的还是二元(两个参数); 运算符被定义为全局函数(对于一元是一个参数,对于二元是两个参数)还是成员函数(对于一...
friend_function 成员变量和函数的存储 c实现了封装,数据和处理数据的操作(函数)是分开存储的。 c中的非静态数据成员直接内含在类对象中,就像c语言的struct一样。 成员函数并不会出现在对象中,而是作为类的一部分存储在代码段中,需要通过对象或对象指针进行调用。成员函数可以访问类的所有成员变量和成员函数,包括私有成员,但不能直接访问静态变量,需要使用类名或对象来访问。 每一个非内联成员函数(non-inlinememberfunction)只会诞生一份函数实例. classRegina02{ public: inta; }; classRegina03{ public:...
inline_func 在c中,预定义宏的概念是用内联函数来实现的,而内联函数本身也是一个真正的函数。内联函数具有普通函数的所有行为。唯一不同之处在于它在编译时会被直接插入到调用它的地方,而不是像普通函数那样在运行时被调用。这样,内联函数可以避免函数调用的开销,提高代码执行效率,所以不需要函数调用的开销。因此应该不使用宏,使用内联函数。 C中的宏函数是一种使用预处理器定义的函数宏。它们是一种在编译阶段进行简单文本替换的机制,可以将代码中的宏函数调用替换为相应的文本。宏函数通常使用define指令来定义。 预处理宏的缺陷 宏函数的定义格式如下: define宏函数名(参数列表)替换文本 这里的...