当前位置: 首页 > article >正文

Qt 每日面试题 -10

91、Qt设计界面有哪些方式?

  1. 手工编写创建界面的代码︰此方法比较复杂,不够直观;
  2. 使用Qt Designer界面编辑器设计︰可直接拖放控件、设置控件的属性,简单、直观、易于操作;
  3. 动态加载Ul文件并生成界面︰(QUiLoader类加载xx.ui)此方法很灵活,当需要更改界面时只需更改.Ul文件即可,无需重新编译程序。

A. 手工设计界面

使用手工创建代码时,需要从Qt已有的GUI类库中选择一个类作为基类继承,并且添加必要的其它成员。通常,我们会选择从QDialog、QWidget、QMainWindow等类中选择一个作为主窗体﹔然后创建其它的控件,并使用布局管理器布局这些控件;最后将该布局设置为主窗体的布局。此步骤用图描述如下︰例如,对于下图所示的FindDialog对话框,就可以通过从QDialog继承,并添加按钮、布局管理器等到派生类中完成该对话框的设计。相关的代码如下︰

class FindDialog : public QDialog
{
	Q_OBJECT
	public:
		FindDialog(Qwidget*parent = 0);
	signals:
		void findNext(const Qstring &str,Qt::casesensitivity cs);
		void findPrevious(const Qstring &str, Qt::casesensitivity cs);
	private slots:
		void findclicked();
		void enableFindButton(const Qstring &text); 
	private:
		//窗体中的控件
		QLabel * label;
		QLineEdit * lineEdit; 
		QCheckBox * casecheckBox;
		QCheckBox * backwardcheckBox;
		QPushButton * findButton;
		QPushButton * closeButton;
} ; 

FindDialog::FindDialog(Qwidget *parent): QDialog(parent)
{	
	//下面的代码创建窗体中的控件
	label = new QLabel(tr("Find &what: "));
	lineEdit = new QLineEdit;
	label->setBuddy(lineEdit); 
	casecheckBox = new QCheckBox(tr("Match&case"));
	backwardcheckBox = new QCheckBox(tr("search &backward"));
	findButton =new QPushButton(tr("&Find")) ; 
	findButton->setDefault(true);
	findButton->setEnabled(false);
	closeButton = new QPushButton(tr("close")); 
	connect(lineEdit,SIGNAL(textchanged(const qstring &)) , 
		this,sLOT(enableFindButton(const Qstring&) ) ) ;
	connect(findButton,SIGNAL (clicked(),
		this,SLOT(findclicked()) ;
	connect(closeButton,SIGNAL(clicked() ,
		thissLOT(close()));
	//使用布局管理器布局控件
	QHBoxLayout *topLeftLayout = new QHBoXLayout;
	topLeftLayout->addwidget(label) ; 
	topLeftLayout->addwidget(lineEdit) ;
	QVBoxLayout *leftLayout = new QVBoxLayout;
	leftLayout->addLayout(topLeftLayout);
	leftLayout->addwidget(casecheckBox); 
	leftLayout->addwidget(backwardcheckBox);
	QVBoXLayout *rightLayout = new  QVBoXLayout;
	rightLayout->addwidget(findButton); 
	rightLayout->addwidget(closeButton) ;
	rightLayout->addstretch();
	QHBoXLayout *mainLayout = new QHBoxLayout;
	mainLayout->addLayout(leftLayout);
	mainLayout->addLayout(rightLayout);
	//设置窗口的布局管理器
	setLayout(mainLayout);
	setwindowTitle(tr("Find")) ;
	setFixedHeight(sizeHint().height());
}

B. 使用Qt Designer设计界面

采用Qt Designer,使得快速创建对话框成为可能。在Qt Designer环境中,所有的操作都采用可视化的操作,可拖放控件、关联信号与槽、设置特定控件的属性。

C. 动态加载UI文件并生成界面

前面的两种方法需要事先创建好相应的文件或代码,然后连同其它文件进行编译,如果后期要修改界面则必须修改代码或Ul文件并重新编译。而不需要重新编译整个程序的方法是采用动态加载UI文件的方式。基本的操作方法为先使用Qt Designer设计界面,然后按下图的流程操作︰

如下图所示,创建一个mainwindow.ui的UT文件。之后就可以采用QUiLoade类动态加载该文件,并生成该窗体。

参考的代码如下:

#include <QUiLoader>
#include <QFile>
int main(int argc,char *argv[])
{
	QApplication a(argc, argv) ;
	QUiLoade loader;
	QFile file("mainwindow.ui"); 
	loader.load(&file)->show() ; 
	return a.exec();
}

上面的代码中QUiLoader::load()使用了QFile对像作为数据源,并且会生成QWidget对像,最后使用了QWidget::show()显示上图中的窗体界面。另外需要注意的是,如果要使能QUiLoader动态加载特性,必须在工程件*.pro中添加如下行:CONFIG += uitools

92、Qt Socket通道信的过程

Qt Socket通信的过程主要分为以下几步︰

  1. 创建Socket︰ 使用QTcpSocket类创建Socket,并初始化连接参数;
  2. 连接服务器︰使用connectToHost()函数连接服务器;
  3. 发送数据︰ 使用write()函数发送数据;
  4. 接收数据︰ 使用read()函数接收数据;
  5. 断开连接︰ 使用disconnectFromHost()函数断开连接。

93、QWidget和QML的技术本质和使用上,有什么区别?

QWidget是一种基于C++的桌面应用程序开发技术,主要用于开发桌面应用程序,它是一种面向对象的技术,可以使用C++语言来实现用户界面的设计和编程。

QML是一种基于JavaScript的应用程序开发技术,主要用于开发桌面应用程序和移动应用程序,它是一种基于声明式的技术,可以使用JavaScript语言来实现用户界面的设计和编程。

两者的本质有所不同,QWidget是基于C++的,QML是基于JavaScript的;
使用上也有所不同,QWidget是面向对象的,QML是基于声明式的。

94、用Qt实现一个三角形的按钮,会如何实现?

首先,我们需要使用Qt的QPushButton类来创建一个按钮,然后设置按钮的样式,使其可以显示出一个三角形的形状。

  1. 创建QPushButton类的实例,并设置按钮的样式︰
QPushButton *triangleButton = new QPushButton();
triangleButton->setStyleSheet("QPushButton	{\
								border-image:url(:/images/triangle.png);\
											}");
  1. 设置按钮的大小︰
triangleButton->setFixedSize(QSize(30,30));
  1. 连接按钮的点击信号和槽函数︰
connect(triangleButton, SIGNAL(clicked()), this, SLOT(onTriangleButtonClicked());
  1. 实现槽函数︰
void onTriangleButtonClicked()
{
	//在这里实现点击三角形按钮时要执行的操作
}

95、Qt如何实现类似QQ登录窗口的翻转

Qt可以使用QPropertyAnimation类来实现QQ登录窗口的翻转效果。

  1. 首先,创建一个QPropertyAnimation对象,并设置动画的目标对象,属性和时间曲线:
QPropertyAnimation *animation = new QPropertyAnimation(this, "geometry");
animation->setDuration(500);
animation->setEasingCurve(QEasingCurve::OutExpo);
  1. 然后,设置动画的起始值和结束值:
//设置起始值
QRect startRect(0,0, width(), height());
animation->setStartValue(startRect);
//设置结束值
QRect endRect(width(), 0, width(), height());
animation->setEndValue(endRect);
  1. 最后,启动动画:
animation->start();

96、Qt窗口圆角如何实现

在Qt中实现窗口圆角,可以使用Qt的样式表实现,如下所示︰

Qwidget {
	border-radius: 10px;
}

//可以使用如下代码来应用样式表︰
QFile file("style.qss");
file.open(QFile::Readonly);
QString stylesheet = QLatinlstring(file.readAll());
qApp->setstylesheet(stylesheet);

97、Qt的智能指针,QSharePoint和shared_ptr有什么区别,weak_ptr呢?

Qt智能指针是一种特殊的指针,它可以指向另一个指针。它可以用来创建复杂的数据结构,如链表或树结构。

  1. QSharePoint是一种智能指针,它可以自动管理指向的对象的内存分配和释放,从而实现自动内存管理。

  2. shared_ptr也是一种智能指针,它可以跟踪指向的对象的引用计数,从而保证在没有任何引用的情况下,可以自动释放指向的对象。

  3. weak_ptr是一种特殊的shared_ptr,它可以指向shared_ptr指向的对象,但不会增加指向对象的引用计数。它可以用来避免循环引用导致的内存泄漏问题。

98、Qt的信号与槽,有哪几种连接方式,对应的应用场景是什么?

Qt的信号与槽有三种连接方式︰

  1. 信号槽的直接连接︰ 使用QObject:connect()函数连接信号和槽,当信号发出时,槽函数自动被调用,适用于信号发出者与槽函数拥有者在同一线程的场景。

  2. 信号槽的槽函数链接︰ 使用QObject:.connect()函数连接信号和槽函数,当信号发出时,槽函数被调用,适用于信号发出者与槽函数拥有者不在同一线程的场景。

  3. 信号槽的信号连接︰ 使用QObject:connect()函数连接信号和信号,当信号发出时,另一个信号也会发出,适用于信号发出者与槽函数拥有者不在同一线程的场景。

99、QShareDataPoint作用

QShareDataPoint是一种用于收集和分享数据的技术。它可以帮助企业收集、分析和共享数据,以便更好地管理业务。它可以帮助企业收集和分析客户行为,改进服务质量,提高运营效率,并帮助企业更好地理解市场动态。

100、死锁怎么解决?

  1. 避免死锁 : 可以采用一些技术避免死锁的发生,比如破坏互斥条件破坏请求和保持条件、破坏循环等等。

  2. 预防死锁 : 可以采用一些技术来预防死锁的发生,比如限制进程获取资源的数量安全序列、死锁检测等等。

  3. 解除死锁 : 可以采用一些技术来解除已经发生的死锁,比如银行家算法、延迟算法等等。


http://www.kler.cn/a/399132.html

相关文章:

  • 【linux】如何扩展磁盘容量(VMware虚拟机)-转载
  • reactflow 中 selectionMode 组件作用
  • C++析构函数详解
  • ARM 汇编指令
  • 【网络安全 | 漏洞挖掘】通过密码重置污染实现账户接管
  • 【MySQL】MySQL的笛卡尔积现象是什么?简单说说
  • Oracle OCP认证考试考点详解082系列19
  • 【微服务】SpringBoot 整合ELK使用详解
  • git入门环境搭建和gui使用
  • 《目标检测》R-CNN网络基础(RCNN,Fast-RCNN)
  • 笔记01----Transformer高效语义分割解码器模块DEPICT(即插即用)
  • 【配置后的基本使用】CMake基础知识
  • opc da 服务器数据 转 IEC61850项目案例
  • 人工智能+辅助诊疗
  • 雨晨 Hotpatch 24H2 Windows 11 iotltsc2024 极简版 26100.2240
  • 十五届蓝桥杯赛题-c/c++ 大学b组
  • R语言机器学习与临床预测模型77--机器学习预测常用R语言包
  • 基于STM32的智能家居系统:MQTT、AT指令、TCP\HTTP、IIC技术
  • CentOS中的Firewalld:全面介绍与实战应用
  • 《C++设计模式:重塑游戏角色系统类结构的秘籍》
  • GCP Cloud Storage 的lock retention policy是什么
  • pytorch tensor在CPU和GPU之间转换,numpy之间的转换
  • C++初级入门(1)
  • Istio分布式链路监控搭建:Jaeger与Zipkin
  • 在VMware虚拟机环境下识别U盘
  • 25-深入理解 JavaScript 异步生成器的实现