在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    19126

    瀏覽量

    305198
  • Qt
    Qt
    +關注

    關注

    1

    文章

    304

    瀏覽量

    37920
  • 秒表
    +關注

    關注

    3

    文章

    77

    瀏覽量

    22017
收藏 人收藏

    評論

    相關推薦

    【「嵌入式系統設計與實現」閱讀體驗】+ 學習一STM32的案例

    嵌入式系統設計與實現——第六屆全國大學生嵌入式芯片與系統設計競賽芯片應用賽道優秀作品剖析》一書的基本情況。今天來學習一具體的案例。 這本書中意法半導體的案例是最多的,尤其是第二部分
    發表于 12-06 22:22

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

    在現代科技浪潮中,嵌入式技術已成為支撐各種智能設備和系統運行的核心力量。那么,究竟什么是嵌入式嵌入式系統,顧名思義,是將計算機的硬件和軟件嵌入到某種設備或系統中,以
    的頭像 發表于 10-16 10:14 ?973次閱讀

    嵌入式系統的原理和應用

    嵌入式系統是一種專用的計算機系統,其設計初衷是執行特定任務,而非作為通用計算機使用。這類系統通常作為更大系統的一部分,起到控制、監控或輔助的作用,具有資源受限、實時性高、可靠性強等特點。下面將從嵌入式系統的原理、應用兩個方面進行
    的頭像 發表于 10-05 17:03 ?895次閱讀

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

    嵌入式主板,通常被稱為嵌入式系統的核心組件,是一種用于控制和數據處理的計算機硬件,其設計旨在嵌入特定設備中執行專門任務。嵌入式主板如同是設備的“大腦”,主要功能是根據需要管理和控制設備
    的頭像 發表于 09-30 10:05 ?470次閱讀

    嵌入式環形隊列與消息隊列的實現原理

    嵌入式環形隊列,也稱為環形緩沖區或循環隊列,是一種先進先出(FIFO)的數據結構,用于在固定大小的存儲區域中高效地存儲和訪問數據。其主要特點包括固定大小的數組和兩個指針(頭指針和尾指針),分別指向隊列的起始位置和結束位置。
    的頭像 發表于 09-02 15:29 ?527次閱讀

    七大嵌入式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 ?5889次閱讀

    什么是嵌入式SoC

    嵌入式SoC有兩個顯著的特點:一是硬件設計難度大;二是軟件比重大,需要進行軟 硬件協同設計。舉個例子,比如城市相比農村的優勢很明顯:配套齊全、交通便利、效率高。
    發表于 05-03 17:30 ?1487次閱讀
    什么是<b class='flag-5'>嵌入式</b>SoC

    嵌入式系統中集成Rust和Qt的實踐

    Rust 擁有豐富的庫生態系統,用于序列化和反序列化、異步操作、解析不安全輸入、線程、靜態分析等,而 Qt 是一 C++ 工具包,支持跨各種平臺的豐富的、基于 GUI 的應用程序,從 iOS 到嵌入式Linux。
    發表于 05-03 10:26 ?1817次閱讀
    在<b class='flag-5'>嵌入式</b>系統中集成Rust和<b class='flag-5'>Qt</b>的實踐

    如何運用emwin把顯示屏分為上下兩個窗口實現上下窗口分別可以左右滑動?

    怎么運用emwin把顯示屏分為上下兩個窗口,可以實現上下窗口分別可以左右滑動?
    發表于 04-26 06:03

    fpga和嵌入式應該學哪個

    FPGA和嵌入式系統是兩個不同的領域,各有其特點和優勢,選擇學習哪個取決于個人的興趣、職業目標以及市場需求。
    的頭像 發表于 03-27 14:43 ?780次閱讀

    fpga是嵌入式開發嗎

    FPGA(現場可編程門陣列)與嵌入式開發之間確實存在一定的關聯,但它們在本質上是兩個不同的領域。
    的頭像 發表于 03-15 14:18 ?1045次閱讀

    arcgis中如何關聯兩個屬性表

    在ArcGIS中,關聯兩個屬性表是一重要的操作,可以通過此操作將兩個表中的數據關聯起來,以便進行分析和查詢。下面是詳細介紹如何在ArcGIS中實現屬性表的關聯。 首先,我們需要明確
    的頭像 發表于 02-25 11:01 ?4241次閱讀

    嵌入式軟件開發和軟件開發的區別

    嵌入式軟件開發和軟件開發是兩個不同的概念,它們在一些關鍵方面有著明顯的區別。嵌入式軟件開發是指開發嵌入在硬件設備中的軟件,而軟件開發一般指開發運行在通用計算機上的軟件。本文將從多個方面
    的頭像 發表于 01-22 15:27 ?2286次閱讀
    主站蜘蛛池模板: 特级毛片网站| 99热久久精品最新| 黄色的视频免费看| 波多野结衣在线观看一区二区三区 | 视频在线一区二区| 色日本在线| 456主播喷水在线观看| 800免费资源网| 亚洲成人av| 国产成人经典三级在线观看| 国产在线视频网站| 欧美黑人xxxx猛牲大交| 亚洲29p| 凹凸福利视频导航| 男人女人的免费视频网站| 熊出没之环球大冒险旧版免费观看| 黄色大片网| 夜夜夜夜夜夜夜工噜噜噜| 五月激情婷婷网| videosgratis乱色欧美野外| 在线观看视频在线观看| 四虎国产精品永久在线看| 一级黄视频| you ji z z日本人在线观看| 亚洲w码欧洲s码免费| 国产大乳喷奶水在线看| 欧美另类69| 青草久草视频| se视频在线观看| 555成人免费影院| 午夜综合| 精品三级内地国产在线观看| 欧美尺寸又黑又粗又长| 亚洲国产精品自在现线让你爽| 欧洲freexxxx性| 久久久久88色偷偷免费| 午夜理伦| 天天综合网久久| 一级毛片视频在线| 一本到视频在线| 国产成人精品高清免费|