第17章 Qt面试题分析与讲解


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

第17章 Qt面试题分析与讲解

0. 什么是 qt有什么优点 

Qt 是诺基亚开发的一个跨平台的 C++图形用户界面应用程序框架。

它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。

Qt 是完全面向对象的很容易扩展并且允许真正地组件编程。

是一个跨平台的 C++ 图形用户界面库。 

Qt 具有非常强的跨平台和移植性强的特点。

同时支持 linux、 windows、嵌入式的用户界面开发。

好文章,来自【福优学苑@音视频+流媒体】




1. QT信号槽机制的优缺点 

  • 1)QT信号槽机制的引用精简了程序员的代码量 

  • 2)QT的信号可以对应多个槽(但他们的调用顺序随机),也可以多个槽映射一个信号 

  • 3)QT的信号槽的建立和解除绑定十分自由 

  • 4)信号槽同真正的回调函数比起来时间的耗损还是很大的,所有在嵌入式实时系统中应当慎用 

  • 5)信号槽的参数限定很多例如不能携带模板类参数,不能出现宏定义等等

2. Qt信号和槽的本质是什么

回调函数

好文章,来自【福优学苑@音视频+流媒体】


3. 如何实现一个自定义按钮, 

使其在光标进入,按下,离开三种状态下显示不同的图片. 

方法一:

创建一个类, 让其从QPushButton类派生, 重写该类中的事件处理器函数 

1>. enterEvent() – 光标进入 

2>. leaveEvent() – 光标离开 

3>. mousePressEvent() – 鼠标按下 

4>. paintEvent() – 刷新背景图 

在每个事件中切换不同的图片, 通过paintEvent函数将新的图片刷新到按钮上 

手动刷新函数: update() 


方法二:

setStyleSheet(...)

QPushButton{}

QPushButton:hover{}

QPushButton:press{}

好文章,来自【福优学苑@音视频+流媒体】


4. 多线程情况下, Qt中的信号槽分别在什么线程中执行, 如何控制? 

可以通过connect函数的第五个参数来控制, 信号槽执行时所在的线程 

1>. 直接连接 – 信号槽函数在信号发出者所在线程中执行 

2>. 队列连接 – 信号在信号发出者所在线程中执行,槽函数在信号接收者所在线程中执行. 

3>. 自动连接 – 多线程时为队列连接方式, 单线程时为直接连接方式 

默认情况为自动连接方式.

好文章,来自【福优学苑@音视频+流媒体】

好文章,来自【福优学苑@音视频+流媒体】

5. 描述Windows下一个消息从触发到处理的整个路由过程. 

应用程序启动, 操作系统为程序创建一个对应的消息队列, 用户对创建进行操作, 产生一系列消息, 

操作系统首先捕捉到这些消息, 将消息投递到对应的消息队列中, 在应用程序中对应一个消息循环 


消息循环每次从消息队列中取出消息, 取出的消息如果是虚拟键消息, 会将其转换成标准消息, 将转换的消息再次投递到消息队列, 如果取出的是标准消息, 会将该消息发送给操作系统, 操作系统会调用对应的窗口过程函数, 下窗口过程函数中对对用的消息进程处理.

好文章,来自【福优学苑@音视频+流媒体】

好文章,来自【福优学苑@音视频+流媒体】



6. 使用编码实现Lable显示“hello world”的功能

#include<QApplication>

#include<QWidget>

#include<QLabel>


int main(int argc,char *argv[]) {

    QApplication app(argc,argv); 

    QWidget *pWidget = new QWidget; 

    QLabel label(pWidget); 

    label.setText("hello world"); 

    pWidget->show();

    return app.exec(); 

好文章,来自【福优学苑@音视频+流媒体】

好文章,来自【福优学苑@音视频+流媒体】

7. 编写代码实现调用槽函数退出的 quit 

好文章,来自【福优学苑@音视频+流媒体】


#include<QtGui/QWidget>

#include<QPushButton>

#include<QtGui> 

int main(int argc,char *argv[]) { 

    QApplication app(argc,argv); 

    QWidget *pWidget = new QWidget; 

    QPushButton *button = new QPushButton("Quit",pWidget);

    QObject::connect(button,SIGNAL(clicked()),pWidget,SLOT(close())); 

    pWidget->show();

    return app.exec(); 

}

好文章,来自【福优学苑@音视频+流媒体】


8. 编程实现 spinbox 和 slider的交互界面

如下两种期间的范围全部是 0-200。

Title 为“enter your age”


#include<QApplication>

#include<QHBoxLayout>

#include<QSpinBox>

#include<QSlider> 

int main(int argc,char* argv[]) { 

    QApplication app(argc,argv);

    //创建 app 的构造函数 

    QWidget *pWidget= new QWidget; //new 一个 Widget 

    //设置 caption

    pWidget->setWindowTitle("enter your age"); 

    

    QSpinBox* spinbox = new QSpinBox;

    //new 一个 spinbox 

    //new 一个 slider

    QSlider* slider = new QSlider(Qt::Horizontal); 

    spinbox->setRange(0,200); 

    //设置范围,->符号 slider->setRange(0,200);

    

    QObject::connect(spinbox,SIGNAL(valueChanged(int)),slider,SLOT(se tValue(int)));

        QObject::connect(slider,SIGNAL(valueChanged(int)),spinbox,SLOT(se tValue(int))); 

   

 //信号和槽,(发送者,信号,接收者,槽).第一个是 spinbox 发送给 slider 的 

    //第二个是 slider 发送给 spinbox 的 spinbox->setValue(23); 

    //QHBoxLayout 是布局管理器即在水平方向上排列窗口部件 

    QHBoxLayout* layout = new QHBoxLayout; 

    layout->addWidget(spinbox); 

    layout->addWidget(slider); 

    pWidget->setLayout(layout); 

    pWidget->show(); 

    return app.exec(); 

} //窗体显示

好文章,来自【福优学苑@音视频+流媒体】

好文章,来自【福优学苑@音视频+流媒体】

9. 如何编译运行 qt 程序命令是什么 

  • qmake -project 

  • qmake 

  • make 

好文章,来自【福优学苑@音视频+流媒体】

好文章,来自【福优学苑@音视频+流媒体】

10. 如何将UI界面文件转化成代码的.h文件 

假设 ui 文件名为 hello.ui。 

UIC -o hello.h   hello.ui

好文章,来自【福优学苑@音视频+流媒体】


11. QApplication QGuiApplication QCoreApplication 区别和联系

QCoreApplication、QGuiApplication、QApplication区别和联系:


继承关系:

QApplication <- QGuiApplication <- QCoreApplication <- QObject


所处的Qt模块

QCoreApplication定义在core模块中,为应用程序提供了一个非gui的事件循环;


QGuiApplication定义在gui模块中,提供了额外的gui相关的设置,比如桌面设置,风格,字体,调色板,剪切板,光标;


QApplication定义在widgets模块中,是QWidget相关的,能设置双击间隔,按键间隔,拖拽距离和时间,滚轮滚动行数等,能获取桌面,激活的窗口,模式控件,弹跳控件等。

好文章,来自【福优学苑@音视频+流媒体】

应用场景:

如果你的应用程序是无界面的,直接使用QCoreApplication即可;

如果是gui相关,但没有使用widgets模块的就使用QGuiApplication,否则使用QApplication。

好文章,来自【福优学苑@音视频+流媒体】



12. QApplication的主要功能

好文章,来自【福优学苑@音视频+流媒体】

初始化应用程序

使用所在桌面的参数例如调色板(palette())、字体(font())、双击间隔(doubleClickInterval())等信息初始化应用程序。当我们改变桌面的一些设置时,可以让应用程序的这些设置保持一致。


事件管理:

QApplication从底层窗口系统接收事件,并通过sendEvent()或postEvent()发送给需要的窗口。


命令行管理:

通过解析命令行参数,来设置程序内部状态。


外观管理:

在运行时,可以通过setStyle()函数来改变QApplication包含的一个QStyle对象,从而改变应用程序的外观。


颜色策略:

制定程序的颜色策略,详见setColorSpec()函数说明。


国际化管理:

通过translate()函数可以设置本地化的字符串。


剪切板管理:

QApplication还包含一些非常方便的类,例如屏幕信息类(desktop())和剪切板类(clipboard())。


窗口管理:

QApplication包含所有窗口的信息,可以知道程序在屏幕上的位置(widgetAt()),顶层窗口列表(topLevelWidgets()),关闭所有窗口(closeAllWindows())等等。


鼠标光标管理:

QApplication能够管理鼠标光标样式。参照setOverrideCursor();


好文章,来自【福优学苑@音视频+流媒体】

13. Qt国际化的三部曲

QT国际化(lupdate/linguits/lrelease)

14. Qt国际化的操作步骤

①tr函数:

在程序设计阶段,程序代码中每一个用户可见的字符串都用tr()函数封装,以便QT提取界面字符串用于生成翻译资源文件。

用UI设计器可视化窗体时同一用一种语言,如汉语

②ts文件:

在项目配置文件(.pro文件)中设置需要导出的翻译文件(.ts)名称,使用lupdate工具扫描项目文件中需要翻译的字符串,并生成翻译文件

③Linguist翻译专家:

使用Qt的Linguist程序打开生成的翻译文件,将程序中的字符串翻译为需要的语言,如将所有中文字符串翻译为英文

④qm文件:

使用lrelease工具编译翻译好的翻译文件,生成更为紧凑的“.qm”文件

⑤翻译器:

在应用程序中使用QTranslator调用不同的“.qm”文件,实现不同的语言界面




好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***