81、请写一个调用消息对话框提示报错的程序
cpp
QMessageBox::waring(this,tr("警告"), tr("用户名或密码错误!"),QMessageBox::Yes)
82、Qt都提供哪些标准对话框以供使用,他们实现什么功能?
Qt提供9个标准对话框:
- QColorDialog 颜色对话框,能够允许用户选择颜色;
- QErrorMessage 显示错误信息;
- QFileDialog 文件对话框,能够允许用户选的一个或者多个文件以及目录;
- QFontDialog 字体对话框,允许用户选择/设置字体;
- QInputDialog 输入对话框,允许用户进行简单的输入;
- QPageSetupDialog 叶设置对话框,配置与页相关的打印机选项;
- QProgressDialog 进度对话框指示一个长时间操作的工作进度,提示用户该操作是否已经停止
- QPrintDialog 打印对话框,配置打印机,可以允许用户选择可用的打印机;
- QMessageBox 信息对话框。
83、如何将UI界面问件转化成代码的. h文件?(假设ui文件名为gogogo. ui)
cpp
uic -o gogogo.h gogogo.ui
84、Qt5实现一个文件对话框
cpp
#include<QFileDialog>
//打开文件对话框
QString file_name=QFileDialog::getopenFileName(this, "请选择需要打开的文件: ",".","*.txt *.png");
//参数1 父控件
//参数2 标题
//参数3 默认路径
//参数4 过滤文件格式
//返回值文件全路径(绝对路径) "D: /ss/注意事项.txt"
qDebug()<<file_name; //打印路径
85、QMainWindow是从哪里派生的?
QMainWindow派生于QWidget类,而QWidget类派生于QObject类
86、QWidget 与 QObject实现了哪些功能
-
QObject
- 信号和槽的非常强大的机制,使用connect()把信号和槽连接起来并且可以用disconnect()来破坏这种连接。为了避免从不结束的通知循环,你可以调用blockSignals()临时地阻塞信号。保护函数connectNotify()和disconnectNotify()使跟踪连接成为可能。
- QObject可以通过event()事件接收和事件过滤。详细情况请参考installEventFilter()和eventFilter()。一个方便的处理者,childEvent(),能够被重新实现来捕获子对象事件。
- QObject提供了Qt中最基本的定时器,关于定时器的高级支持请参考QTimer。
- Q_OBJECT宏对于任何实现信号、槽和属性的对象都是强制的。
- 所有的Qt窗口部件继承了QObject。方便的函数isWidgetType()返回这个对象实际上是不是一个窗口部件。它比inherits("QWidget")快得多。
-
QWidget
- QWidget类是所有用户界面对象的基类。
- Widget是用户界面的基本单元︰它从窗口系统接收鼠标,键盘和其他事件,并在屏幕上绘制自己。每个Widget都是矩形的,它们按照Z-order进行排序。
87、参数传值、指针、引用有什么区别,在什么场景常用哪种传递方式? 传值、传址、传引用的区别,哪个更高效?
- 传值
这种传递方式中,实参和形参是两个不同的地址空间,参数传递的实质是将原函数中变量的值,复制到被调用函数形参所在的存储空间中,这个形参的地址空间在函数执行完毕后,会被回收掉。整个被调用函数对形参的操作,只影响形参对应的地址空间,不影响原来函数中的变量的值,因为这两个不是同一个存储空间。即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。 - 传址
这种参数传递方式中,实参是变量的地址,形参是指针类型的变量,在函数中对指针变量的操作,就是对实参(变量地址)所对应的变量的操作,函数调用结束后,原函数中的变量的值将会发生改变。被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。 - 传引用
这种参数传递方式中,形参是引用类型变量,其实就是实参的一个别名,在被调用函数中,对引用变量的所有操作等价于对实参的操作,这样,整个函数执行完毕后,原先的实参的值将会发生改变。被调函数对形参做的任何操作都影响了主调函数中的实参变量。 - 哪一种更高效?
在内置类型当中三种传递方式的效率上都差不多;
在自定义类型当中,传引用的更高效一些,因为它没有对形参进行一次拷贝
88、const与#define有什么区别
-
const和#define都可以定义常量,但是const用途更广。
-
const 常量有数据类型,而宏常量#define没有数据类型。编译器可以对const进行类型安全检查。而对#define只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
-
有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
89、struct和class有什么区别?
C++中,class与struct都可以定义一个类。他们有以下两点区别:
1.默认继承权限,如果不指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
2.成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。以上两点也是struct和class最基本的差别,也是最本质的差别;但是在C++中,struct进行了扩展,现在它已经不仅仅是一个包含不同数据类型的数据结构了,它包括了更多的功能。
Struct能包含成员函数、有自己的构造函数、可以有析构函数、支持继承、支持多态、支持Private、Protected、Public关键字。
如果是class的父类是struct关键字描述的,那么默认访问属性是什么?
当出现这种情况时,到底默认是public继承还是private继承,取决于子类而不是基类。
class可以继承自struct修饰的类;同时,struct也可以继承自class修饰的类,继承属性如下列描述︰
cpp
class A{};
class B:A{}; // private继承
struct B:A{}; // public继承
最后,那么到底是使用struct,还是使用class呢?
一般来说,两个关键字都是可以的,但是由于编程规范的问题,如果要定义的是一种数据结构,那么用struct,如果是一种对象的话,那么用class。
90、C++内存分配有几种方式?
内存的三种分配方式︰
1.从静态存储区分配︰此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储。
2.在栈区分配︰相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限。
3.在堆区分配︰动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题。