第三章 窗口部件——Qt

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

第一节 基础窗口部件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是一个刻度表盘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值