ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第三章 窗口部件——Qt

2022-01-06 22:00:04  阅读:180  来源: 互联网

标签:const Qt 对话框 void 部件 按钮 第三章 窗口


类继承关系
请添加图片描述

第一节 基础窗口部件QWidget

1.窗口部件QWidget

QWidget类是所有用户界面对象的基类,被称为基础窗口部件。
QWidget继承自QObject类和QPaintDevice类,其中QObject类是所有支持Qt对象模型(Qt Object Model)的Qt对象的的基类,QPaintDevice类是所有可以绘制的对象的基类。

2.窗口、子部件以及窗口类型

(1)窗口

把没有嵌入到其他部件中的部件称为窗口,一般的,窗口都有边框和标题栏。

QWidget *widget = new QWidget();  // 新建QWidget类对象,默认parent参数是0,所以它是个窗口    
QLabel *label = new QLabel();    // 新建QLabel对象,默认parent参数是0,所以它是个窗口
QLabel *label2 = new QLabel(widget);  // label2指定了父窗口为widget,所以不是窗口
(2)子部件

QMainWindow和大量的QDialog子类是最一般的窗口类型。窗口就是没有父部件的部件,所以又称为顶级部件(top-level widget)。
与其相对的是非窗口部件,又称为子部件(child widget)。

(3)窗口类型

QWidget的构造函数有两个参数:QWidget * parent = 0和Qt::WindowFlags f = 0;
前面的parent就是指父窗口部件,默认值为0,表明没有父窗口;
后面的f参数是Qt::WindowFlags类型的,它是一个枚举类型,分为窗口类型(WindowType)和窗口标志(WindowFlags)。
前者可以定义窗口的类型,比如我们这里f=0,表明使用了Qt::Widget一项,这是QWidget的默认类型,这种类型的部件如果有父窗口,那么它就是子部件,否则就是独立的窗口。
当更改窗口类型后,窗口的样式会发生改变,

QWidget *widget = new QWidget(0, Qt::Dialog);  //对话框类型
QLabel *label = new QLabel(0, Qt::SplashScreen);   //欢迎窗口类型

而对于窗口标志,它主要的作用是更改窗口的标题栏和边框,而且它们可以和窗口类型进行位或操作。

QWidget *widget = new QWidget(0, Qt::Dialog | Qt::FramelessWindowHint);  //用来产生一个没有边框的窗口
QLabel *label = new QLabel(0, Qt::SplashScreen | Qt::WindowStaysOnTopHint);  //用来使该窗口停留在所有其它窗口上面

3.窗口的集几何布局

对于窗口的大小和位置,根据是否包含边框和标题栏两种情况,要用不同的函数来获取它们的数值。
这里的函数分为两类,一类是包含框架的,一类是不包含框架的:

包含框架:
	x():返回部件的位置坐标的x值
	y():返回部件的位置坐标的y值
	frameGeometry():返回包含边框的窗口框架矩形的值,其返回值是QRect类型的,它的形式是(位置坐标,大小信息),也就是(x,y,宽,高)
	pos():返回窗口的位置
	move():设置窗口位置
	
不包含框架:
	geometry():返回没有边框的窗口框架矩形的值,其返回值是QRect类型的,它的形式是(位置坐标,大小信息),也就是(x,y,宽,高)
	width():返回窗口内部的宽
	height():返回窗口内部的高
	rect():返回不包含边框的窗口内部矩形
	size():返回不包含边框的窗口大小信息
	resize():设置不包含边框的窗口大小

补充:qDebug()函数
两种输出方式:

方式一:直接将字符串当做参数传给qDebug()函数    如: qDebug("x: %d", x);   // 输出x的值			
方式二:使用输出流的方式一次输出多个值,它们的类型可以不同,  如:qDebug() << "geometry: " << geometry << "frame: " << frame;  //输出geometry和frame的值

需要说明的是,如果只使用第一种方法,那么是不需要添加头文件的,如果使用第二种方法就必须添加这个头文件。
第二种方法时还可以让输出自动换行,qDebug() << endl; //endl起换行作用

第二节 对话框

1.模态和非模态对话框

模态对话框就是在我们没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互。
要想使一个对话框成为模态对话框,只需要调用它的exec()函数:

QDialog dialog(this);
dialog.exec();

非模态对话框,既可以与它交互,也可以与同一程序中的其他窗口交互。
要使一个对话框成为非模态对话框,我们就可以使用new操作来创建,然后使用show()函数来显示:

QDialog *dialog = new QDialog(this);
dialog->show();

使用show()函数也可以建立模态对话框,只需在其前面使用setModal()函数即可。例如:

QDialog *dialog = new QDialog(this);   //它与用exec()函数时的效果是不一样的。
dialog->setModal(true);                //这是因为调用完show()函数后会立即将控制权交给调用者,那么程序可以继续往下执行。
dialog->show();                        //而调用exec()函数却不是这样,它只有当对话框被关闭时才会返回。

与setModal()函数相似的还有一个setWindowModality()函数,它有一个参数来设置模态对话框要阻塞的窗口类型,可以是:

Qt::NonModal(不阻塞任何窗口,就是非模态),
Qt::WindowModal(阻塞它的父窗口和所有祖先窗口以及它们的子窗口),
Qt::ApplicationModal(阻塞整个应用程序的所有窗口)。

2.多窗口切换

(1)信号与槽

用来完成对象之间的协同操作。简单来说,信号和槽都是函数,比如按下窗口上的一个按钮后想要弹出一个对话框,那么就可以将这个按钮的单击信号和我们定义的槽关联起来,在这个槽中可以创建一个对话框,并且显示它。
这样,当单击这个按钮时就会发射信号,进而执行我们的槽来显示一个对话框。
关联方式:

①使用connect函数关联:
connect()函数中的四个参数分别是:发送信号的对象、发送的信号、接收信号的对象和要执行的槽。
②在设计模式关联 请添加图片描述
③自动关联
请添加图片描述

(2)使用自定义对话框登陆主界面
//在main()函数中:
QApplication a(argc, argv);
	MyWidget w;
	MyDialog dialog;                        // 新建MyDialog类对象
	if(dialog.exec()==QDialog::Accepted){   // 判断dialog执行结果
		w.show();              // 如果是按下了“进入主界面”按钮,则显示主界面
		return a.exec();                    // 程序正常运行
	}
	else return 0;
(3)标准对话框
//颜色对话框
void MyWidget::on_pushButton_clicked()
{
	//QColor color = QColorDialog::getColor(Qt::red, this, tr("颜色对话框"),                                       QColorDialog::ShowAlphaChannel);
				
	QColorDialog dialog(Qt::red, this);                // 创建对象
	dialog.setOption(QColorDialog::ShowAlphaChannel); // 显示alpha选项
	dialog.exec();                                    // 以模态方式运行对话框
	QColor color = dialog.currentColor();             // 获取当前颜色
				
	qDebug() << "color: " << color;
}
//文件对话框
void MyWidget::on_pushButton_2_clicked()
{
	//    QString fileName = QFileDialog::getOpenFileName(this, tr("文件对话框"),
	//                             "D:", tr("图片文件(*png *jpg);;文本文件(*txt)"));
				
	//    qDebug() << "fileName:" << fileName;
				
	QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("文件对话框"),
																		"D:", tr("图片文件(*png *jpg)"));
	qDebug()<< "fileNames:" << fileNames;
}
//字体对话框
void MyWidget::on_pushButton_3_clicked()
{
	// ok用于标记是否按下了“OK”按钮
	bool ok;
	QFont font = QFontDialog::getFont(&ok, this);
	// 如果按下“OK”按钮,那么让“字体对话框”按钮使用新字体
	// 如果按下“Cancel”按钮,那么输出信息
	if (ok) ui->pushButton_3->setFont(font);
	else qDebug() << tr("没有选择字体!");
}
//输入对话框
void MyWidget::on_pushButton_4_clicked()
{
	bool ok;
	// 获取字符串
	QString string = QInputDialog::getText(this, tr("输入字符串对话框"),tr("请输入用户名:"), QLineEdit::Normal,tr("admin"), &ok);
	if(ok) qDebug() << "string:" << string;
	// 获取整数
	int value1 = QInputDialog::getInt(this, tr("输入整数对话框"),tr("请输入-1000到1000之间的数值"), 100, -1000, 1000, 10, &ok);
	if(ok) qDebug() << "value1:" << value1;
	// 获取浮点数
	double value2 = QInputDialog::getDouble(this, tr("输入浮点数对话框"),tr("请输入-1000到1000之间的数值"), 0.00, -1000, 1000, 2, &ok);
	if(ok) qDebug() << "value2:" << value2;
	QStringList items;
	items << tr("条目1") << tr("条目2");
	// 获取条目
	QString item = QInputDialog::getItem(this, tr("输入条目对话框"),tr("请选择或输入一个条目"), items, 0, true, &ok);
	if(ok) qDebug() << "item:" << item;
}
//消息对话框
void MyWidget::on_pushButton_5_clicked()
{
	// 问题对话框
	int ret1 = QMessageBox::question(this, tr("问题对话框"),tr("你了解Qt吗?"), QMessageBox::Yes, QMessageBox::No);
	if(ret1 == QMessageBox::Yes) qDebug() << tr("问题!");
	// 提示对话框
	int ret2 = QMessageBox::information(this, tr("提示对话框"),tr("这是Qt书籍!"), QMessageBox::Ok);
	if(ret2 == QMessageBox::Ok) qDebug() << tr("提示!");
	// 警告对话框
	int ret3 = QMessageBox::warning(this, tr("警告对话框"),tr("不能提前结束!"), QMessageBox::Abort);
	if(ret3 == QMessageBox::Abort) qDebug() << tr("警告!");
	// 错误对话框
	int ret4 = QMessageBox::critical(this, tr("严重错误对话框"),tr("发现一个严重错误!现在要关闭所有文件!"), QMessageBox::YesAll);
	if(ret4 == QMessageBox::YesAll) qDebug() << tr("错误");
	// 关于对话框
	QMessageBox::about(this, tr("关于对话框"),tr("yafeilinux致力于Qt及Qt Creator的普及工作!"));
}
//进度对话框
void MyWidget::on_pushButton_6_clicked()
{
	QProgressDialog dialog(tr("文件复制进度"), tr("取消"), 0, 50000, this);
	dialog.setWindowTitle(tr("进度对话框"));     // 设置窗口标题
	dialog.setWindowModality(Qt::WindowModal);  // 将对话框设置为模态
	dialog.show();
	for(int i=0; i<50000; i++) {                // 演示复制进度
		dialog.setValue(i);                     // 设置进度条的当前值
		QCoreApplication::processEvents();      // 避免界面冻结
		if(dialog.wasCanceled()) break;         // 按下取消按钮则中断
	}
	dialog.setValue(50000);    // 这样才能显示100%,因为for循环中少加了一个数
	qDebug() << tr("复制结束!");
}
				
//错误信息对话框
void MyWidget::on_pushButton_7_clicked()
{
	errordlg->setWindowTitle(tr("错误信息对话框"));
	errordlg->showMessage(tr("这里是出错信息!"));
}	
QWizardPage * MyWidget::createPage1()  // 向导页面1
{
	QWizardPage *page = new QWizardPage;
	page->setTitle(tr("介绍"));
	return page;
}
QWizardPage * MyWidget::createPage2()  // 向导页面2
{
	QWizardPage *page = new QWizardPage;
	page->setTitle(tr("用户选择信息"));
	return page;
}
QWizardPage * MyWidget::createPage3()  // 向导页面3
{
	QWizardPage *page = new QWizardPage;
	page->setTitle(tr("结束"));
	return page;
}
//向导对话框
void MyWidget::on_pushButton_8_clicked()
{
	QWizard wizard(this);
	wizard.setWindowTitle(tr("向导对话框"));
	wizard.addPage(createPage1());     // 添加向导页面
	wizard.addPage(createPage2());
	wizard.addPage(createPage3());
	wizard.exec();
}

三、窗口部件

1.QFrame类族

QFrame类是带有边框的部件的基类。它的子类有我们最为常用的标签部件QLabel,另外还有QLCDNumber、QSplitter、QStackedWidget、QToolBox和QAbstractScrollArea类。
带边框部件最主要的特点就是可以有一个明显的边界框架。QFrame类的主要功能也就是用来实现不同的边框效果,这主要是由边框形状(Shape)和边框阴影(Shadow)组合来形成的。
AFrame类:

●共有类型
	enum Shadow { Plain, Raised, Sunken }
	enum Shape { NoFrame, Box, Panel, StyledPanel, ..., WinPanel }
	enum StyleMask { Shadow_Mask, Shape_Mask }
●属性
	frameRect : QRect//控件矩形
	frameWidth : const int//框架的宽度
	frameShadow : Shadow//有无阴影
	lineWidth : int//线宽度
	frameShape : Shape//框架形状
	midLineWidth : int//中间线的宽度
●公有函数
	QFrame(QWidget * parent = 0, Qt::WindowFlags f = 0)//构造函数,设置主窗口和框架类型
	~QFrame()//析构函数
	QRect frameRect() const//返回   框架的rect
		
	Shadow frameShadow() const
	Shape frameShape() const
		
	int QFrame::frameStyle() const//返回框架风格,类似frameShadow()
	int frameWidth() const
	int lineWidth() const
	int midLineWidth() const
	void setFrameRect(const QRect &)
	void setFrameShadow(Shadow)
	void setFrameShape(Shape)
	void setFrameStyle(int style)
	void setLineWidth(int)
	void setMidLineWidth(int)
●重写公有函数
	virtual QSize sizeHint() const//返回尺寸大小
●保护函数
	void initStyleOption(QStyleOptionFrame * option) const//初始化画一个框架
●公有保护函数
	virtual void changeEvent(QEvent * ev)//事件状态改变 
	virtual bool event(QEvent * e)//接收事件 
	virtual void paintEvent(QPaintEvent *)//重绘事件

2.按钮部件

QAbstractButton类是按钮部件的抽象基类,提供了按钮的通用功能。它的子类包括:

①复选框QCheckBox
	●QCheckBox组件简介
		QCheckBox复选框,复选框提供多选多。					
		QCheckBox有三种状态:checked、unchecked和PartiallyChecked。					
	●QCheckBox组件属性
		QCheckBox复选框属性设置选项:					
			A、name:组件对应源代码中所显示的名字。						
			B、text:组件对应图形界面中所显示的名字。						
			C、font:设置text字体。						
			D、enabled:组件是否可用,可用为true,不可用为false。						
			E、checked:用来设置或返回是否选中单选按钮,选中为true,未选中为false。					
	●QCheckBox组件常用成员函数
		QCheckBox::QCheckBox(const QString &text,QWidget *parent,const char *name = 0)//构造一个名称为name、父对象为parent并且文本为text的复选框。						
		bool QCheckBox::isChecked()const  //选中复选框,返回true,否则返回false。						
		void QAbstractButton ::setText(const QString &) //设置组件上显示的文本。						
		QString QAbstractButton ::text()const  //返回组件上显示的文本。						
		void QAbstractButton ::stateChange(int state)[signal]  //当更改checked属性时,将发射这个信号。						
		void QCheckBox::setChecked(bool check)[slot]  //设置复选框是否选中,状态为check的值。					
②标准按钮QPushButton	
	●QPushButton组件简介
		QPushButton组件用于接受用户点击事件,能够显示提示字符串,是功能性组件,需要父组件作为容器,能够在父组件中进行定位,用于执行命令或触发事件。					
		QPushButton的类继承如下:					
		QPushButton :public QAbstractButton :pubic QWidget :public QObject, public QPaintDevice					
	●QPushButton组件属性
		QPushButton 组件属性设置选项:					
			A、name:组件对应源代码中的名字。					
			B、text:组件对应图形界面中显示的名字。					
			C、font:设置text的字体。					
			D、enabled:组件是否可用。					
	●QPushButton组件常用成员函数
		QPushButton::QPushButton(const QString &text,QWidget *parent,const char *name = 0);	//构造一个名称为name,父对象为parent并且文本为text的按压按钮。						
		void QAbstractButton::setText(const QString &)	//设置按钮上显示的文本。						
		QString QAbstractButton::text()const	//返回按钮上显示的文本。						
		void QAbstractButton::pressed()[signal]		//当按下按钮时,发射信号。						
		void QAbstractButton::clicked()[signal]		//当单击按钮时,发射信号。						
		void QAbstractButton::released()[signal]	//当释放按钮时,发射信号。						
	●QPushButton实例
		QPushButton *button = new QPushButton("OK", this);					
		connect(button, SIGNAL(clicked()), this, SLOT(onOK()));
③单选框按钮QRadioButton
	●QRaidoButton组件简介
		QRaidoButton单选按钮,用于提供两个或多个互斥选项。					
	●QRaidoButton组件属性
		QRaidoButton单选按钮属性设置选项:					
			A、name:组件对应源代码中所显示的名字。						
			B、text:组件对应图形界面中所显示的名字。						
			C、font:设置text字体。						
			D、enabled:组件是否可用,可用为true,不可用为false。						
			E、checked:用来设置或返回是否选中单选按钮,选中为true,未选中为false。					
	●QRaidoButton组件常用成员函数
		QRaidoButton::QRadioButton(const QString &text,QWidget *parent,const char *name = 0)//构造一个名称为name、父对象为parent并且文本为text的单选按钮。						
		bool QRadioButton::isChecked()const	 //返回是否选中单选按钮,选中时返回true,没有选中时返回false。						
		void QAbstractButton ::setText(const QString &)	//设置组件上显示的文本。						
		QString QAbstractButton ::text()const  //返回该按钮上显示的文本。						
		void QAbstractButton ::stateChanged(int state)[signal]  //当更改checked属性值时,将发射信号。						
		void QRadioButton::setChecked(bool check)[virtual slot]  //设置单选按钮是否被选中为checked。
④工具按钮QToolButton
	●QToolButton组件简介
		QToolButton工具按钮,是一种用于命令或者选项的可以快速访问的按钮,通常在ToolBar里面。工具按钮通常显示的是图标,而不是文本标签。
		ToolButton支持自动浮起。在自动浮起模式中,按钮只有在鼠标指向它的时候才绘制三维的框架。					
	●QToolButton组件属性
		QToolButton工具按钮设置选项:					
			A、name:组件对应源代码中的名称。						
			B、text:工具按钮标签文本。						
			C、font:设置工具按钮标签的字体。						
			D、autoRaise:自动浮起是否生效。						
			E、iconSet:提供显示在按钮上的图标的图标集。						
			F、on:工具按钮是否为开。						
			G、textLabel:工具按钮自动提示文本。						
			H、usesTextLabel:自动提示文本textLabel是否工作,默认为false。						
	●QToolButton组件常用成员函数
		QToolButton::QToolButton(QWidget *parent,const char *name = 0) //构造一个名字为name,父对象为parent的ToolButton。
			
		QToolButton::QToolButton(const QIconset &iconSet,const QString &textLabel,
		const QString &grouptext,QObject *receiver,const char *slot,QToolBar *parent,const char *name = 0)						
		//构造一个名称为name,父对象为parent(必须为QToolBar)的工具按钮。工具按钮将显示iconSet,工具提示为textLabel,
		//状态条信息为grouptext,同时会将工具按钮链接到receiver对象的槽函数。
			
		QToolBButton::QToolButton(ArrowType type,QWidget *parent,const char *name = 0) 
		//把工具按钮构造成箭头按钮,type定义了箭头的方向,可用的值有LeftArrow、RightArrow、UpArrow、DownArrow。
			
		void QToolButton::setAutoRaise(bool enable) //根据参数enable值设置按钮是否可自动浮起。						
		void QToolButton::setIcon(const QIconSet &) //设置显示在工具按钮上的图标。						
		void QToolButton::setOn(bool enable)[virtual slot]  //设置按钮是否为开,enable等于true则设置为开,否则设置为关。						
		void QToolButton::setTextLabel(const QString &)[slot]  //设置按钮的提示标签。						
		QString QToolButton::textLabel()const  //返回按钮的提示标签。						
		void setToolButtonStyle( Qt::ToolButtonStyle style )  //设置ToolButton的样式,有下列样式:						
			Qt::ToolButtonIconOnly只显示图标						
			Qt::ToolButtonTextOnly只显示文字						
			Qt::ToolButtonTextBesideIcon文字显示在图标旁						
			Qt::ToolButtonTextUnderIcon文字显示在图标下						
			Qt::ToolButtonFollowStyle根据QStyle::StyleHint进行设置						
		void setPopupMode( ToolButtonPopupMode mode )	//设置ToolButton的菜单弹出方式ToolButtonPopupMode,弹出方式如下:QToolButton::DelayedPopup延迟弹出						
			QToolButton::MenuButtonPopup菜单弹出					
			QToolButton::InstantPopup点击立即弹出

3.行编辑器

行编辑器QLineEdit部件是一个单行的文本编辑器,它允许用户输入和编辑单行的纯文本内容,而且提供了一系列有用的功能,
包括撤销与恢复、剪切和拖放等操作。如:
显示模式

Normal:正常显示
NoEcho:不显示任何输入						
PassWord:密码样式,以黑点代替显示						
PasswordEchoOnEdit:编辑时正常,其余以密码样式显示

输入掩码
目的:限制输入的内容,可使用一些特殊字符设置输入的格式和内容
掩码字符:
请添加图片描述

输入验证

在cpp文件中添加
	QValidator * validator = new QIntValidator(100,999,this);    //输入限制为100 ~ 999
	ui -> lineEdit -> setValidator(validator);

自动补全

在类的构造函数中添加
	QStringList wordlist;
	wordlist<<"Qt"<<"Qt Creator"<<QObject::tr("Hello!");//当输入首字母时,有补全提示
	QCompleter * completer = new QCompleter(wordlist,this);         //新建自动完成器材
	completer -> setCaseSensitivity(Qt::CaseSensitive);   //区分大小写   CaseInsensitive不区分大小写
	ui -> lineEdit -> setCompleter(completer);

4.数值设定框

QAbstractSpinBox类是一个抽象基类,它提供了一个数值设定框和一个行编辑器来显示设定值。它有三个子类:
QDateTimeEdit(日期时间设定)
QSpinBox(整数设定)
QDoubleSpinBox(浮点数的设定)

5.滑块部件

QAbstractSlider类提供了一个区间内的整数值,它有一个滑块,可以定位到一个整数区间的任意值。这个类是一个抽象基类,它有三个子类QScrollBar,QSlider和QDial。其中:
滚动条QScrollBar更多的是用在QScrollArea类中来实现滚动区域;
而QSlider是我们最常见的音量控制或多媒体播放进度等滑块;

继承的信号:
	信号                 描述
	valueChanged()       当滑块的值发生了变换,发射此信号,tracking()确定在用户交互时,是否发出此信号。
	sliderPressed()      当用户按下滑块,发射此信号。
	sliderMoved()        当用户拖动滑块,发射此信号。 
	sliderReleased()     当用户释放滑块,发射此信号。 

QDial是一个刻度表盘。

标签:const,Qt,对话框,void,部件,按钮,第三章,窗口
来源: https://blog.csdn.net/qq_40766654/article/details/122353261

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有