【Qt】第三、四章:窗口部件、布局管理

一、窗口部件

(一)基本概念

  1. Qt Creator提供的默认基类只有QMainWindow、QWidget和QDialog三种。
    说明:QMainWindow是带有菜单栏和工具栏的主窗口类;
    QDialog是各种对话框的基类,而它们二者全部继承自QWidget。
    QWidget类关系图
  2. QWidget类是所有用户界面对象的基类,被称为基础窗口部件。QWidget 继承自QObject类 和 QPaintDevice类,其中QObject类是所有支持Qt对象模型(Qt Object Model)的Qt对象的的基类,QPaintDevice类是所有可以绘制的对象的基类。

(二)窗口、部件、基本类型和几何布局

1.e.g:

//新建owidget类对象,默认parent参数是0,所以它是个窗口
Qwidget *widget = new Qwidget();
//设置窗口标题
widget->setwindowTitle(Qobject: :tr("我是widget"));//新建QLabel对象,默认parent参数是0,所以它是个窗口
QLabel *label = new QLabel () ;
label->setwindowTitle (Qobject: :tr("我是label"));
label->setText (Qobject: :tr ( "label:我是个窗口"));
//改变部件大小,以便能显示出完整的内容
label->resize (350,20) ;
//label2指定了父窗口为widget,所以不是窗口
QLabel *label2 = new QLabel (widget) ;
label2->setText (Q0bject::tr ("label2:我不是独立窗口,只是widget的子部件"));
label2->resize (350,20);
label ->show();
widget ->show();
delete label;
delete widget;
return a.exec();;

程序中定义了一个QWidget类对象的指针widget和两个QLabel对象指针labellabel2,其中label 没有父窗口,而label2父窗口为widget;
注意: 这里使用new操作符为label2分配了空间,但是并没有使用delete进行释放,这是因为在Qt中销毁父对象的时候会自动销毁子对象,这里label2指定了parent为widget,所以在delete widget时会自动销毁它。
2. 窗口部件: 像主窗口、对话框、标签、按钮、文本输入框等都是窗口部件。这些部件可以接收用户输入,显示数据和状态信息,并且在屏幕上绘制自己。有些也可以作为一个容器来放置其他部件。Qt中把没有嵌入到其他部件中的部件称为窗口,一般窗口都有边框和标题栏,就像程序中的widget和 label一样。
3. 子部件: 窗口就是没有父部件的部件。与其相对的是非窗口部件,又称为子部件。如程序中的 label2。
4. 窗口类型: 比如QWidget中有一个setWindowState()函数用来设置窗口的状态;其参数由Qt::WindowStates指定,是Qt::WindowState枚举类型值的或组合。窗口状态Qt :: WindowState包括最大化Qt::WindowMaximized、最小化Qt :: WindowMinimized,全屏显示Qt :: WindowFullScreen和活动窗口Qt::WindowActive等。默认值为正常状态Qt::WindowNoState。
e.g:

Qwidget *widget = new QWidget (0,Qt::Dialog | Qt ::FramelesswindowHint);//产生一个没有边框的窗口
QLabel *label = new QLabel(0,Qt::SplashScreen | Qt::windowStaysOnTopHint);//使窗口停留在其他窗口上面

5.几何布局:
对于窗口的大小和位置,根据是否包含边框和标题栏两种情况,要用不同的函数来获取它们的数值。(分包含框架和不包含框架)
几何布局
e.g:

widget.resize(400,300);
设置窗口大小
widget.move(200,100);
//设置窗口位置
widget.show();
int x =widget.x();
//输出x的值
qDebug("x:%d",x);
int y = widget.y();
qDebug("y;%d",y);

QRect geometry = widget.geometry();
QRect frame = widget.frameGeometry();
qDebug()<<"geometry: "<<geometry<<"frame: "<<frame;.

说明:
(1) 这里用到了qDebug打印信息,要在头文件加上#include< QDebug>,且用了两种方法可以打印出信息。
(2) x()、y()分别返回部件的位置坐标的x、y值,它们的默认值为0
(3) geometry()和frameGeometry()函数分别返回 没有边框 和 包含边框 的窗口框架矩形的值,其返回值是QRect类型的,就是一个矩形,它的形式是(位置坐标,大小信息),也就是(x,y,宽,高)。

输出:输出

(三)对话框QDialog

  • 概念: QDialog类是所有对话框窗口类的基类。对话框窗口是一个经常用来完成短小任务或者和用户进行简单交互的顶层窗口。
  • 模态与非模态对话框
    按照运行对话框时是否还可以和该程序的其他窗口进行交互,对话框常被分为两类:模态的(modal)和非模态的(modeless)。
    ①模态对话框:就是会阻塞同一应用程序中其它窗口的输入。模态对话框是在我们没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互。
    ②非模态对话框:既可以与它交互,也可以与同一程序中的其他窗口交互。
    e.g:模态
    运行结果:
    这时运行程序会发现一个窗口一闪而过,然后只显示MyWidget类对象的窗口。
    ②要想使一个对话框成为模态对话框,只需要调用它的exec()函数:
    ③使用模态对话框时,事件就在对话框内部循环,必须将对话框关闭才能继续执行主界面的操作。
    注:使用show()函数也可以建立模态对话框,只需在其前面使用setModal() 函数即可。例如:
    设置模态对话框
    与调用exec区别:调用完show()函数后会立即将控制权交给调用者,那么程序可以继续往下执行。而调用exec()函数却不是这样,它只有当对话框被关闭时才会返回。

(四)信号与槽

1.概念: 信号和槽都是函数,是在Qt中来完成对象之间的协同操作。
2.关联方式
2.1 手动关联:connect()函数
connect()函数中的四个参数分别是:发送信号的对象、发送的信号、接收信号的对象和要执行的槽,而信号和槽要分别使用SIGNAL()和SLOT()宏括起来。
步骤 e.g :
① 在头文件(.h)中写槽的声明:如

 public slots: void showDialog () ;

②在对应c文件中写槽函数的实现:如

void Mywidget: :showDialog ({
QDialog *dialog=new QDialog (this);
dialog->show();
}

③在c文件的MyWidget类的构造函数中使用connect()关联按钮单击信号自定义的槽如下:
connect (ui->showButton,SIGNAL (clicked ()),this, SLOT (showChildDialog ()));
2.2 在设计模式中关联
点击设计器上方的“编辑信号/槽”图标,或者按下快捷键F4,这时便进入了部件的信号和槽的编辑模式。在“退出”按钮(提前拖上一个push button)上按住鼠标左键,然后拖动到窗口界面上,这时松开鼠标左键。在弹出的配置连接对话框中,选中下面的“显示从QWidget继承的信号和槽”选项,然后在左边的QPushButton栏中选择信号clicked(),在右边的QDialog栏中选择对应的槽close(),完成后按下“确定”。
2.3 自动关联: 利用在控件(如按钮)右键转到槽,然后在生成的槽函数中编写代码即可

(五)标准对话框

1.概念: Qt提供了一些常用的对话框类型,它们全部继承自QDialog类,并增加了自己的特色功能,比如获取颜色、显示特定信息等。
2.颜色对话框:

QColor color = QColorDialog: :getColor(Qt::red,thistr("颜色对话框"));qDebug () <<"color: " <color;

3.文件对话框:

QString fileName = QFileDialog: :getOpenFileName(this, tr("文件对话框"),
"D:",tr("图片文件(* png * jpg)"));
qDebug( "fileName:"< fileName;

4.消息对话框:

//问题
int ret1 = QMessageBox: : question(this, tr("问题对话框"),
tr("你知道吗?"),QMessageBox::Yes,QMessageBox::NO);
//提示
int ret2= QMessageBox;;information(this,tr("提示对话框")tr("这是Qt!"),QMessageBox::0k);
//警告
int ret3 = QMessageBox;:warning(thistr("警告对话框"),
tr("不能提前结束!"),QMessageBox::Abort);

5.进度对话框:

QProgressDialog dialog(tr("文件复制进度")tr("取消")050000,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("复制结束!");

(六)其他窗口部件

  • QFrame–带边框的部件的基类。其子类包括最常用的标签部件QLabel、另外还有QLCDNumber、QSplitter、QStackedWidget、 QToolBox。
  • QAbstractButton类–按钮部件的抽象基类。其提供了按钮的通用功能。它的子类包括复选框QCheckBox、标准按钮QPushButton、单选框按钮QRadioButton和工具按钮 QToolButton。

二、布局管理

  1. 布局管理器: Qt的布局管理系统提供了强大的机制来自动排列窗口中的所有部件,确保它们有效地使用空间。Qt包含了一组布局管理类,从而在应用程序的用户界面中对部件进行布局,比如QLayout的几个子类,这里将它们称作布局管理器。
  2. 分类: QLayout类是布局管理器的基类。一般只使用QLayout的几个子类,它们分别是
  • QBoxLayout(基本布局管理器)—含:QHBoxLayout(水平布局管理器)和QVBoxLayout(垂直布局管理器)
  • QGridLayout(栅格布局管理器)
  • QFormLayout(窗体布局管理器)
  • QStackedLayout(栈布局管理器)
  1. 设置Tab键顺序
    ①ui界面可直接设置
    ②代码:
setTabOrder(ui->lineEdit,ui->spinBox); //lineEdit在spinBox前面
setTabOrder(ui->spinBox,ui->pushButton); //spinBox在pushButton前面
setTabOrder(ui->pushButton,ui->checkBox); //pushButton在checkBox前面

备注

参考书目: Qt Creator快速入门第三版霍亚飞编著-北京航空航天大学出版社

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值