Qt中的多窗体编程(续一)
在前面一节中,已经把所有需要的窗体都创建好了,下面将依次实现预设的功能。
一、实现点击菜单打开模式子窗体的功能。
1、在编辑模式下双击Forms下的“mainWindow.ui”,打开主窗体,在窗体下面的“Action Editor”标签页中会看到action和action_3两项,其中的action就是前面创建的操作菜单中的“时钟”一项,而action_3则是“退出”一项。这里缺了action_2项,因为它其实就是前面创建过的“分隔符”。在action上右键并选择“转到槽...”,如下图所示。

2、在打开的对话框中,选择QAction下的triggered()方法,如下图所示,点击“OK”按钮。

3、开发环境会直接跳转到mainWindow.cpp文件中,并已经填充好了on_action_triggered()函数的框架,在其中输入如下图所示的代码,并保存。

4、上图中的对象time还没有定义,在头文件Headers中双击“mainwindow.h”,打开该头文件,先在其中包含timedialog.h的头文件 ,然后在private下面加入time的定义并保存,如下图所示。

5、以同样的方式,再创建一个“退出”的槽函数on_action_3_triggered(),并在其中添加如下图所示的代码,以在点击“退出”时关闭整个程序。

6、完成后点击绿色三角形按钮运行程序,等待其编译完成,就可以看到运行起来的主窗体了,然后单击菜单“操作”->“时钟”,即可打开时间显示的子窗体了,如下图所示。点击“操作”->“退出”就可关闭程序。

上面的子窗体为模态子窗体,即在子窗体关闭前,主窗体不能被操作。若把前面程序中设置模态窗体的“time->setModal(true);”一句注释掉,则默认生成非模态的子窗体。
二、实现子窗体的加工美化。
1、设置子窗体的大小固定,并把标题栏上的问号按钮去除,然后把默认按键中改为中文的“确定”和“取消”,再把LCD Number进行一些美化等等,这些更改都在子窗体文件timeDialog.cpp中进行,如下图所示。

2、要使用buttonBox进行按钮配置,需要包含相应的头文件,打开timedialog.h文件,并在其中包含需要的头文件,如下图所示。

3、在子窗体的可视化设计界面中,把LCD Number控件拖动到合适的位置,并在右边的属性中找到“windowTitle”一项,把名称改为“时钟”,保存后运行程序,子窗体的显示效果如下图所示,此时的窗体边框不能被拖动,即不能更改窗体大小。

三、实现子窗体的实时时间显示功能。
1、 为了能实时显示时间又不增加系统资源的额外开销,需要把时间显示放在一个新建的线程中去。
2、新建线程文件,在项目中最顶端的untitiled1上点右键,选择“添加新文件...”一项,会弹出新建文件的对话框,在“文件和类”中选择C++,然后选择其中的“C++Source File”一项,如下图所示,点击“Choose...”按钮。

3、在弹出的对话框中,填入新建的线程程序文件名称,这里填入“timeshowthread”,如下图所示,点击“下一步”按钮。

4、接下来询问是否把新建的文件加入到项目中,这里默认加入,如下图所示,点击“完成”按钮。

5、重复上面的步骤,再新建一个配套的头文件timeshowthread.h(注意在上面的第2步中选择“C++Header File”一项), 全部完成后如下图所示。

6、在刚才新建的线程文件timeshowthread.cpp中,加入下面的代码。
#include "timeshowthread.h"
#include <QTime>
timeshowThread::timeshowThread()
{
}
void timeshowThread::run()
{
while(1)
{
QDateTime current_date_time = QDateTime::currentDateTime(); //获取系统当前时间
// QString current_week = current_date_time.toString("ddd");
// QString current_date = current_date_time.toString("yyyy.MM.dd");
QString current_time = current_date_time.toString("hh:mm:ss"); //格式化为 QString
emit sendTime(current_time); //发射信号
msleep(100);
}
}
7、在配置的头文件timeshowthread.h中,加入如下的相关定义。
#ifndef TIMESHOWTHREAD_H
#define TIMESHOWTHREAD_H #include <QThread>
#include <QString>
class timeshowThread : public QThread
{
Q_OBJECT
public:
timeshowThread();
signals:
void sendTime(QString);
protected:
void run();
public slots:
}; #endif // TIMESHOWTHREAD_H
8、线程文件准备好后,就可在子窗体程序timedialog.cpp中调用了。首先在头文件timedialog.h中加入线程对象和槽函数的相关定义,如下图所示。

9、在timedialog.cpp的主函数的末尾处,添加下面的代码以连接槽函数及启用线程。
TimeshowThread = new timeshowThread; //新建时间处理线程
connect(TimeshowThread, SIGNAL(sendTime(QString)), this, SLOT(DisplayTime(QString))); //连接显示槽函数
TimeshowThread->start(); //启动线程
10、同时在timedialog.cpp的末尾处,添加下面的槽函数。
void timeDialog::DisplayTime(QString time) //时间显示槽函数
{
ui->lcdNumber->display(time);
}
11、全部添加完成后的样子如下图所示。

12、保存后运行程序,时间显示子窗体将会实时显示系统的当前时间,如下图所示。

Qt中的多窗体编程(续一)的更多相关文章
- Qt中采用多线程实现Socket编程
Socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 本文介绍的是Qt中采用多线程Socket编程,由于工作的需要,开始 ...
- Windows平台下Qt中glut库的使用
用Qt中的QGLWidget窗体类中是不包括glut工具库的,难怪在myGLWidget(在我的程序中是QGLWidget的派生类)中绘制实心球体是说“glutSolidSphere”: 找不到标识符 ...
- QT中使用Glut库
用Qt中的QGLWidget窗体类中是不包括glut工具库的,难怪在myGLWidget(在我的程序中是QGLWidget的派生类)中绘制实心球体是说“glutSolidSphere”: 找不到标识符 ...
- Qt中QString、QByteArray、int、double之间转换
最近写Qt中的tcp网络编程,Socke连接后,接受到的数据类型是字节型,这就涉及到了大量的类型转换,在网上辗转几辄,总算有了点结果,特此跟大家分享.好了,不废话,下面细说. 方法/步骤 1. ...
- QT中的SOCKET编程(QT-2.3.2)
转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...
- Qt中的多线程编程
http://www.ibm.com/developerworks/cn/linux/l-qt-mthrd/ Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功 ...
- 在Qt(C++)中与Python混合编程
一.PythonQt库 在Qt(C++)中与Python混合编程,可以使用PythonQt库. 网站首页:http://pythonqt.sourceforge.net 下载页面:https://so ...
- c# WinForm窗体编程中对窗体程序设置快捷键
c# WinForm窗体编程中对窗体程序设置快捷键http://www.cnblogs.com/bison1989/archive/2011/09/19/2180977.html /// <su ...
- QT中的SOCKET编程
转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...
- qt中窗体全屏
原文地址:https://www.cnblogs.com/wiessharling/p/3750461.html 近期在学习QT时遇到了很多问题这也是其中一个,个人通过在各种书籍和网络上的查阅找到了一 ...
随机推荐
- 自研分布式高性能RPC框架及服务注册中心实践笔记【原创】【开源】
痛点 1. bsf底层依赖springcloud,影响bsf更新springboot新版本和整体最新技术版本升级. 2. eureka已经闭源,且框架设计较重,同时引入eureka会自行引入较多spr ...
- 国产paozhu c++ web framework 正式版发布
经过大半个月测试修改 paozhu c++ web framework 正式版发布, 1.0.5 release 官方第一次发布正式版,可以用于生产环境. 易用性 超越国外各种 c++ web fra ...
- python文件的写入与读出
Python对文件的处理,新建目录,写入一个txt文件然后读取刚才写入的内容.这里是在windows系统演示,目录用"\".如果在linux系统,区别就是目录的斜杠号要用" ...
- 让 Win8.1 微软拼音新体验模式支持 Metro 应用
内容回顾: [1]十个步骤找回 Win8 中的微软拼音新体验模式 [2]发布个工具,一键恢复Win8/8.1中的微软拼音长句模式(新体验模式) 在 [1] 中,我们找回了 Win8 里的微软拼音新体验 ...
- 最新版 Proteus 8.15 Professional 图文安装教程 [ 附安装包 ]
前言 Proteus 是世界上唯一将电路仿真软件.PCB设计软件和虚拟模型仿真软件三合一的设计平台. Proteus 8.15 现已发布,本篇将带领大家安装此版本. 介绍 Proteus Proteu ...
- 论文翻译:2022_腾讯DNS 1th TEA-PSE: Tencent-ethereal-audio-lab personalized speech enhancement system for ICASSP 2022 DNS CHALLENGE
论文地址:TEA-PSE: 用于ICASSP 2022 DNS挑战赛的Tencent-ethereal-audio-lab 个性化语音增强系统 论文代码: 引用格式:Ju Y, Rao W, Yan ...
- 一小时学会微信小程序
一小时学会微信小程序 目录 一.小程序概要 1.1.发展历史 1.2.小程序的诞生 二.微信小程序介绍 三.开发微信小程序的软件下载与初步配置 3.1.获取微信小程序的AppID 3.2.下载安装微 ...
- LeetCode_806. 写字符串需要的行数
题目 难度:简单 原文:https://leetcode-cn.com/problems/number-of-lines-to-write-string/ 题目 我们要把给定的字符串 S 从左到右写到 ...
- mvn引用本地包
<dependency> <groupId>jna</groupId> <artifactId>jna</artifactId> <s ...
- spring-in-action-day04-配置属性 @ConfigurationProperties
1.Spring环境抽象的概念 2.怎么配置属性.在application.yml举例一些常用的配置 3.自定义配置属性@ConfigurationProperties(prefix = " ...