第8篇 基础(八)设置Qt状态栏
林中静月下仙
原创Java领域优质创作者
关注
0点赞·320人阅读
导语
在程序主窗口QMainWindow中,主要包含菜单栏,工具栏,中心部件和状态栏。前面几个已经讲过了,这一篇讲解状态栏的使用。
环境是:Windows 7 + Qt 4.8.1 +Qt Creator 2.4.1
目录
一、添加动作状态提示
二、显示其他临时信息
三、显示永久信息
正文
一、添加动作状态提示
1.首先还是打开上一篇完成的程序。对于菜单动作添加状态提示,可以很容易的在设计器中来完成。
2.下面进入设计模式,在Action编辑器中选中新建动作,然后在右面的属性编辑器中将其statusTip更改为“新建文件”。如下图所示。
3.这时运行程序,当光标移动到新建动作上时,在下面的状态栏将会出现设置的提示。如下图所示。
我们可以按照这种方式来设置其他动作的状态栏提示信息。
二、显示其他临时信息
状态信息可以被分为三类:临时信息,如一般的提示信息,上面讲到的动作提示就是临时信息;正常信息,如显示页数和行号;永久信息,如显示版本号或者日期。可以使用showMessage()函数来显示一个临时消息,它会出现在状态栏的最左边。一般用addWidget()函数添加一个QLabel到状态栏上用于显示正常信息,它会生成到状态栏的最左边,可能会被临时消息所掩盖。
1.我们到mainwindow.cpp文件的构造函数最后面添加如下一行代码:
ui->statusBar->showMessage(tr("欢迎访问Qt爱好者社区!"))
登录后复制
这样就可以在运行程序时显示指定的状态提示了。效果如下图所示。
这个提示还可以设置显示的时间。如:
ui->statusBar->showMessage(tr("欢迎访问Qt爱好者社区!"), 2000)
登录后复制
这样提示显示2000毫秒即2秒后会自动消失。
2.下面我们在状态栏添加一个标签部件用来显示一般的提示信息。因为无法在设计模式向状态栏添加部件,所以只能使用代码来实现。先在mainwindow.h文件中添加类的前置声明:
class QLabel
登录后复制
然后添加一个私有对象定义:
QLabel *statusLabel
登录后复制
下面到mainwindow.cpp文件中,先添加头文件声明:
#include <QLabel>
登录后复制
然后到构造函数中将前面添加的:
ui->statusBar->showMessage(tr("欢迎访问Qt爱好者社区!"), 2000)
登录后复制
一行代码注释掉,再添加如下代码:
statusLabel = new QLabel
statusLabel->setMinimumSize(150, 20)// 设置标签最小大小
statusLabel->setFrameShape(QFrame::WinPanel)// 设置标签形状
statusLabel->setFrameShadow(QFrame::Sunken)// 设置标签阴影
ui->statusBar->addWidget(statusLabel)
statusLabel->setText(tr("欢迎访问Qt爱好者社区!"))
登录后复制
这时运行程序,效果如下图所示。
下面就可以在需要显示状态的时候,调用statusLabel来设置文本了。
三、显示永久信息
如果要显示永久信息,要使用addPermanentWidget()函数来添加一个如QLabel一样的可以显示信息的部件,它会生成在状态栏的最右端,不会被临时消息所掩盖。
我们在构造函数中添加如下代码:
QLabel *permanent = new QLabel(this)
permanent->setFrameStyle(QFrame::Box | QFrame::Sunken)
permanent->setText(
tr("<a href=\"http://www.yafeilinux.com\">yafeilinux.com</a>"))
permanent->setTextFormat(Qt::RichText)
permanent->setOpenExternalLinks(true)
ui->statusBar->addPermanentWidget(permanent)
登录后复制
这样就在状态栏的右侧添加了一个网站的超链接,点击该链接就会自动在浏览器中打开网站。运行程序,效果如下图所示。
结语
到这里整个文本编辑器的程序就算写完了。我们这里没有写帮助菜单的功能实现,大家可以自己添加。而且程序中也有很多漏洞和不完善的地方,如果有兴趣,大家也可以自己修改。因为时间和篇幅的原因,我们这里就不再过多的讲述。如果想学习一下多文档编辑器的实现,可以参考《Qt及Qt Quick开发实战精解》一书的多文档编辑器的实例。
布局管理器刚开始用的时候,会出现比例不是自己想要的,又或者自动缩放尺寸不理想,这个时候就会想要设置布局管理器中控件的大小,达到理想布局。一般不设置尺寸比例的话,都是等比分布,设置尺寸比例的时候最好添加的控件都重新设置控件可以设置最大尺寸和最小尺寸,如果最大尺寸和最小尺寸一样,控件就固定尺寸,在布局管理器里也一样,不会自动缩放。这个控件做的比较早,是很早以前定制一个电信客户端时候用到的,该客户端需要在首页展示轮播预先设定好的图片,图片的路径可以自由设定,然后轮播的间隔速度可以自由控制,同时该控件还需要提供两种指示器的风格,一种是迷你型的样式,一种是数字型的样式。本控件很早就做好了,由于当时的QPainter功力不足,还不是很熟悉QPainter,采用的是效率比较低的直接用现有控件堆积而成,比如指示器采用的QLabel,用样式表来控制对应的形状,指示器所在的底部放一个widget,采用左右布局,然后右侧放一个d簧把指示器label全部顶在左边,至于图片的显示,采用的是样式表中的border-image来设置,开个定时器,到了时间则设置成不同的border-image即可。这种方法虽然效率低了点,但是初学者很容易理解接收,甚至可以做出更多的效果,只要项目对CPU要求不高,也不失为一种还行的办法。超过146个精美控件,涵盖了各种仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮按钮、滑动选择器、农历等。远超qwt集成的控件数量。
每个类都可以独立成一个单独的控件,零耦合,每个控件一个头文件和一个实现文件,不依赖其他文件,方便单个控件以源码形式集成到项目中,较少代码量。qwt的控件类环环相扣,高度耦合,想要使用其中一个控件,必须包含所有的代码。全部纯Qt编写,QWidget+QPainter绘制,支持Qt4.6到Qt5.12的任何Qt版本,支持mingw、msvc、gcc等编译器,不乱码,可直接集成到Qt Creator中,和自带的控件一样使用,大部分效果只要设置几个属性即可,极为方便。每个控件都有一个对应的单独的包含该控件源码的DEMO,方便参考使用。同时还提供一个所有控件使用的集成的DEMO。
每个控件的源代码都有详细中文注释,都按照统一设计规范编写,方便学习自定义控件的编写。每个控件默认配色和demo对应的配色都非常精美。超过130个可见控件,6个不可见控件。部分控件提供多种样式风格选择,多种指示器样式选择。所有控件自适应窗体拉伸变化。 集成自定义控件属性设计器,支持拖曳设计,所见即所得,支持导入导出xml格式。自带activex控件demo,所有控件可以直接运行在ie浏览器中。 集成fontawesome图形字体+阿里巴巴iconfont收藏的几百个图形字体,享受图形字体带来的乐趣。
所有控件最后生成一个dll动态库文件,可以直接集成到qtcreator中拖曳设计使用。在开发Qt应用程序时,为了程序上组件布局的美观,所以要给每个组件设定一个合适的大小和位置。用户在使用我们开发的程序的时候,会自己调整页面的大小,因此还需要再用户调整界面大小的时候,组件能够根据程序页面的调整,做出组件尺寸和组件内容大小的自适应调整,从而保证程序页面不会产生变形。在构造函数中的这个函数强制设置窗体的布局为固定大小,用户不可自行调整对话框大小。布局管理器将会负责调整大小的任务,当一些子窗口期间显示或隐藏的时候自动的调整对话框的大小,以保证对话框总是以优化了的大小显示。基于jquery和jquery ui的自动布局,并支持直接调整每个模块的大小和调整位置,且方便与后台传送数据。在鼠标移动至每个模块上时,右下角会出现调整的图标,可进行drag和resize。其中的插件gridstack是在github中查找下载的,大家可直接在下载其中的demo查看。
void MainWindow::createStatusBar(){
locationLabel = new QLabel(" W999 ")//以文字" W999 " 建立 一个新的QLabel的对象
locationLabel->setAlignment(Qt::AlignHCenter)//文字对齐方式为中间对齐
locationLabel->setMinimumSize(locationLabel->sizeHint())
//设置这个Label的最小大小为当前最适合的大小。即Label的最小面积就是现在的大小了
formulaLabel = new QLabel
formulaLabel->setIndent(3)
//设置自动缩进
statusBar()->addWidget(locationLabel)
statusBar()->addWidget(formulaLabel, 1)
//第二个参数是设置 窗体 伸张系数的,默认为0.
connect(spreadsheet, SIGNAL(currentCellChanged(int, int, int, int)),
this, SLOT(updateStatusBar()))
connect(spreadsheet, SIGNAL(modified()),
this, SLOT(spreadsheetModified()))
updateStatusBar()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)