0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式Qt-实现两个窗口的切换

码农爱学习 来源:码农爱学习 作者:码农爱学习 2022-09-09 09:03 次阅读

之前的文章,分别有介绍过使用Qt程序实现一个时钟和一个秒表,本篇,来将这两个功能整合在一起,实现两个页面的随意切换,并且两个页面能独立运行,互不影响。

先来看下最终的效果,通过左侧的两个按钮,实现两个页面的切换。

pYYBAGMZ9UWATgCbAACkkXYpMHA477.png

1 Qt堆栈窗口

本篇的页面切换功能,是利用Qt的QStackedWidget实现的。

1.1QStackedWidget

QStackedWidget 类提供了多页面切换的布局,一次只能显示一个界面。

1.2 基础模板

对于QStackedWidget的使用,可以先参考下面这个模板,配合QLabel来控制页面的切换:

#include "stackdlg.h"
#include 

StackDlg::StackDlg(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle(tr("StackedWidget"));

    list = new QListWidget(this); //创建ListWidge
    list->insertItem(0, tr("Window1")); //ListWidge中添加Item
    list->insertItem(1, tr("Window2")); //ListWidge中添加Item
    list->insertItem(2, tr("Window3")); //ListWidge中添加Item

    stack = new QStackedWidget(this); //创建StackedWidget
    label1 = new QLabel(tr("WindowTest1"));
    label2 = new QLabel(tr("WindowTest2"));
    label3 = new QLabel(tr("WindowTest3"));
    stack->addWidget(label1); //StackedWidget中添加窗口1
    stack->addWidget(label2); //StackedWidget中添加窗口2
    stack->addWidget(label3); //StackedWidget中添加窗口3

    QHBoxLayout *mainLayout = new QHBoxLayout(this); //创建竖直布局器
    mainLayout->setMargin(5);
    mainLayout->setSpacing(5);
    mainLayout->addWidget(list);                      //放入ListWidge
    mainLayout->addWidget(stack,0, Qt::AlignHCenter); //放入StackedWidget
    mainLayout->setStretchFactor(list, 1);  //ListWidge的伸缩尺度是1
    mainLayout->setStretchFactor(stack, 3); //StackedWidget的伸缩尺度是3

    // ListWidge的行状态变化时,切换对应的StackedWidget显示
    connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int)));
}

该代码的运行效果如下:

poYBAGMZ9YSAfe_DAAANjE8O4O0194.png

本篇就在这个模板的基础上,将Qt时钟程序和Qt秒表程序移植过来。

2 移植时钟与秒表程序

2.1 时钟程序移植

将之前这篇中的程序作为一个独立的窗口移植到本篇的程序中:嵌入式Qt-动手编写并运行自己的第1个ARM-Qt程序

移植步骤:

Qt Creator中,堆栈窗口基础工程的基础上,点文件菜单,再点新建文件或项目,新建一个C++类,名字可取clockwidget

pYYBAGMZ9ZCAQS_jAAA6p17FOZs671.png

将Qt时钟的程序复制过来,代码基本不需要修改,只需要把类名换成ClockWidget即可

例如其构造函数如下:

ClockWidget::ClockWidget(QWidget *parent) : QWidget(parent)
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(1000);

    setWindowTitle(tr("Clock"));
    setMinimumSize(200, 200); //设置最小尺寸
}

2.2 秒表程序移植

将之前这篇中的程序作为一个独立的窗口移植到本篇的程序中:嵌入式Qt-做一个秒表

秒表这个Qt程序,用到了Qt Creator的图形页面设计,因此要主要移植的不同之处。

移植步骤:

Qt Creator中,堆栈窗口基础工程的基础上,点文件菜单,再点新建文件或项目,新建一个C++类,名字可取TimerWidget

将ui文件也拷贝过来,在工程中,通过添加现有文件的方式,将ui文件添加进工程

另外,可以将移植过来的ui文件,更名为TimerWidget.ui。需注意的是,修改了文件名后,还需要将ui文件以文本的形式打开,修改对应的类名为TimerWidget,要包含的头文件也改名为ui_TimerWidget.h

pYYBAGMZ9ZmAGs21AADp1aIedfk134.png

移植后的构造函数如下:

#include "timerwidget.h"
#include "ui_TimerWidget.h"
#include
#pragma execution_character_set("utf-8")

TimerWidget::TimerWidget(QWidget *parent) : QWidget(parent), ui(new Ui::TimerWidget)
{
    ui->setupUi(this);
    connect(&timer, SIGNAL(timeout()), this, SLOT(timeout_slot()));
    connect(&timer, SIGNAL(timeout()), this, SLOT(update()));
    connect(ui->Btn_Reset, SIGNAL(clicked()), this, SLOT(update()));

    time.setHMS(0,0,0,0);
    ui->Txt_ShowTime->setText("00:00:00");

    ui->Btn_Start->setChecked(false);
    ui->Btn_Reset->setEnabled(false);
    ui->Btn_Hit->setEnabled(false);
}

注意头文件包含的是ui_TimerWidget.h,构造函数继承的ui也是Ui::TimerWidget

2.3 主程序框架

移植好Qt时钟程序和Qt秒表程序后,就可以将这两个功能加入到堆栈窗口中了。

注意,下面的页面切换,我改用两个QPushButton来实现Qt时钟和Qt秒表的页面切换,并使用QGridLayout进行布局,使得两个按钮位于整个界面的左侧。

StackDlg::StackDlg(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle(tr("StackedWidget"));
    setMinimumSize(800, 480);
    qDebug("Hello");

    QPushButton *pClockButton = new QPushButton("时\n钟", this);
    QPushButton *pTimerButton = new QPushButton("秒\n表", this);
    pClockButton->setFixedSize(QSize(80,200));
    pClockButton->setFont(QFont("Times", 20));
    pTimerButton->setFixedSize(QSize(80,200));
    pTimerButton->setFont(QFont("Times", 20));

    pStack = new QStackedWidget(this);
    ClockWidget *pClockWidget = new ClockWidget();
    TimerWidget *pTimerWidget = new TimerWidget();
    pStack->addWidget(pClockWidget);
    pStack->addWidget(pTimerWidget);

    QGridLayout *mainLayout = new QGridLayout(this);
    mainLayout->addWidget(pClockButton, 0, 0, Qt::AlignCenter);
    mainLayout->addWidget(pTimerButton, 1, 0, Qt::AlignCenter);
    mainLayout->addWidget(pStack, 0, 1, 2, 1);

    mainLayout->setContentsMargins(10,10,1,1);
    mainLayout->setColumnStretch(1, 10);
    mainLayout->setRowStretch(1, 1);

    connect(pClockButton, SIGNAL(clicked()), this, SLOT(showClock()));
    connect(pTimerButton, SIGNAL(clicked()), this, SLOT(showTimer()));
}

void StackDlg::showClock()
{
    qDebug("%s", __func__);
    pStack->setCurrentIndex(0);
}
void StackDlg::showTimer()
{
    qDebug("%s", __func__);
    pStack->setCurrentIndex(1);
}

另外需要注意的是,Qt的信号和槽机制,需要信号和槽函数的参数一致或信号的参数多于槽的参数,而按钮按下没有参数,但切换堆栈页面需要一个参数(索引号,指示要展示第几个页面),因此不能直接使用pStack的setCurrentIndex作为槽函数,需要自己再封装一层,分别写两个按钮按下时的槽函数。

3 测试

将代码在Windows上编译运行ok后,再将源码复制到Ububtu中进行交叉编译,具体的编译过程可参考之前的文章:嵌入式Qt-动手编写并运行自己的第1个ARM-Qt程序

然后将编译后的程序复制到Linux板子中运行,运行效果如下:

https://www.bilibili.com/video/BV1RB4y147s7

poYBAGMZ9k2AG4n1AAwEBnPpxDQ594.png

可以看到Qt时钟和Qt秒表这两个页面可以随意切换,并且两个页面独立运行,某个页面被隐藏显示时,其计时功能仍在运行,再次将页面切换回来,计时时间也是对的。

4 总结

本篇介绍了介绍了QStackedWidget的使用,通过这个类,实现了Qt时钟和Qt秒表这两个页面可以随意切换。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19104

    浏览量

    304786
  • Qt
    Qt
    +关注

    关注

    1

    文章

    302

    浏览量

    37899
  • 秒表
    +关注

    关注

    3

    文章

    77

    浏览量

    22012
收藏 人收藏

    评论

    相关推荐

    【「嵌入式系统设计与实现」阅读体验】+ 学习一STM32的案例

    嵌入式系统设计与实现——第六届全国大学生嵌入式芯片与系统设计竞赛芯片应用赛道优秀作品剖析》一书的基本情况。今天来学习一具体的案例。 这本书中意法半导体的案例是最多的,尤其是第二部分
    发表于 12-06 22:22

    什么是嵌入式?一文读懂嵌入式主板

    在现代科技浪潮中,嵌入式技术已成为支撑各种智能设备和系统运行的核心力量。那么,究竟什么是嵌入式嵌入式系统,顾名思义,是将计算机的硬件和软件嵌入到某种设备或系统中,以
    的头像 发表于 10-16 10:14 921次阅读

    嵌入式系统的原理和应用

    嵌入式系统是一种专用的计算机系统,其设计初衷是执行特定任务,而非作为通用计算机使用。这类系统通常作为更大系统的一部分,起到控制、监控或辅助的作用,具有资源受限、实时性高、可靠性强等特点。下面将从嵌入式系统的原理、应用两个方面进行
    的头像 发表于 10-05 17:03 816次阅读

    嵌入式主板是什么意思?嵌入式主板全面解析

    嵌入式主板,通常被称为嵌入式系统的核心组件,是一种用于控制和数据处理的计算机硬件,其设计旨在嵌入特定设备中执行专门任务。嵌入式主板如同是设备的“大脑”,主要功能是根据需要管理和控制设备
    的头像 发表于 09-30 10:05 446次阅读

    嵌入式环形队列与消息队列的实现原理

    嵌入式环形队列,也称为环形缓冲区或循环队列,是一种先进先出(FIFO)的数据结构,用于在固定大小的存储区域中高效地存储和访问数据。其主要特点包括固定大小的数组和两个指针(头指针和尾指针),分别指向队列的起始位置和结束位置。
    的头像 发表于 09-02 15:29 475次阅读

    七大嵌入式GUI盘点

    。 MiniGUI 一款国产GUI,一款面向嵌入式系统的高级窗口系统和图形用户界面(GUI)支持系统,由魏永明先生于1998年底开始开发。2002年,魏永明先生创建北京飞漫软件技术有限公司,为MiniGUI
    发表于 09-02 10:58

    嵌入式QT常见开发方式有哪些?

    提供的丰富组件如按钮、文本框、窗口等构建传统的桌面应用风格界面。对于嵌入式设备上的复杂用户界面或者需要高性能响应的应用,Qt Widgets是一较为常用的选择。 2.
    发表于 08-12 10:05

    PLC与嵌入式的区别是什么

    在工业自动化和嵌入式系统领域,PLC(Programmable Logic Controller,可编程逻辑控制器)和嵌入式系统是两个常被提及的概念。它们各自具有独特的特点和应用场景,但也常常被误解
    的头像 发表于 05-28 16:22 5798次阅读

    什么是嵌入式SoC

    嵌入式SoC有两个显著的特点:一是硬件设计难度大;二是软件比重大,需要进行软 硬件协同设计。举个例子,比如城市相比农村的优势很明显:配套齐全、交通便利、效率高。
    发表于 05-03 17:30 1465次阅读
    什么是<b class='flag-5'>嵌入式</b>SoC

    嵌入式系统中集成Rust和Qt的实践

    Rust 拥有丰富的库生态系统,用于序列化和反序列化、异步操作、解析不安全输入、线程、静态分析等,而 Qt 是一 C++ 工具包,支持跨各种平台的丰富的、基于 GUI 的应用程序,从 iOS 到嵌入式Linux。
    发表于 05-03 10:26 1784次阅读
    在<b class='flag-5'>嵌入式</b>系统中集成Rust和<b class='flag-5'>Qt</b>的实践

    如何运用emwin把显示屏分为上下两个窗口实现上下窗口分别可以左右滑动?

    怎么运用emwin把显示屏分为上下两个窗口,可以实现上下窗口分别可以左右滑动?
    发表于 04-26 06:03

    fpga和嵌入式应该学哪个

    FPGA和嵌入式系统是两个不同的领域,各有其特点和优势,选择学习哪个取决于个人的兴趣、职业目标以及市场需求。
    的头像 发表于 03-27 14:43 770次阅读

    fpga是嵌入式开发吗

    FPGA(现场可编程门阵列)与嵌入式开发之间确实存在一定的关联,但它们在本质上是两个不同的领域。
    的头像 发表于 03-15 14:18 1032次阅读

    arcgis中如何关联两个属性表

    在ArcGIS中,关联两个属性表是一重要的操作,可以通过此操作将两个表中的数据关联起来,以便进行分析和查询。下面是详细介绍如何在ArcGIS中实现属性表的关联。 首先,我们需要明确
    的头像 发表于 02-25 11:01 4184次阅读

    嵌入式软件开发和软件开发的区别

    嵌入式软件开发和软件开发是两个不同的概念,它们在一些关键方面有着明显的区别。嵌入式软件开发是指开发嵌入在硬件设备中的软件,而软件开发一般指开发运行在通用计算机上的软件。本文将从多个方面
    的头像 发表于 01-22 15:27 2266次阅读