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秒表这两个页面可以随意切换。

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

    关注

    5057

    文章

    18965

    浏览量

    301853
  • Qt
    Qt
    +关注

    关注

    1

    文章

    301

    浏览量

    37780
  • 秒表
    +关注

    关注

    3

    文章

    77

    浏览量

    21987
收藏 人收藏

    评论

    相关推荐

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

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

    嵌入式系统的原理和应用

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

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

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

    七大嵌入式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 5067次阅读

    什么是嵌入式SoC

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

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

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

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

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

    fpga和嵌入式应该学哪个

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

    fpga是嵌入式开发吗

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

    arcgis中如何关联两个属性表

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

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

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

    什么是嵌入式系统?嵌入式系统的具体应用

    嵌入式,一般是指嵌入式系统。用于控制、监视或者辅助操作机器和设备的装置。
    的头像 发表于 12-20 13:33 2329次阅读

    两个硬盘2系统开机切换

    准备、系统安装、系统切换和注意事项。 一、硬件准备 在开始之前,我们首先要确保我们有两个可用的硬盘,每个硬盘上都可以安装一操作系统。我们建议使用两个独立的硬盘而不是分区来
    的头像 发表于 11-28 15:08 7080次阅读