網站首頁 編程語言 正文
在Qt自帶的控件中,也存在抽屜控件:QToolBar。但是,該控件有個缺點:一次只能展開一個抽屜信息,無法實現多個展開。為此,實現了如下效果的程序:
下面對這種實現效果進行講解~
功能講解
開發環境:VS2017 + Qt5.14.2 64位
實現的核心技術:
1:QScrollArea的應用。
2:垂直布局的應用。
根據展示效果可以發現:一個標題下面對應了一個顯示窗口,標題的下拉按鈕控制了粉色窗口的顯示和隱藏。
接下來,由內向外進行實現。
自定義標題widget
類名:QSingleTitleWidget
代表了每一個單獨的標題窗口。包含了兩個控件:QLabel、QCheckBox,分別展示標題名稱以及控制是否展示對應的內容窗口
標題名稱控件的創建
QString qsLabelStyle = "QLabel{color:#333333; font-family:Microsoft YaHei UI; font-size:18px;} QLabel{background-color: transparent}"; m_labTitle = new QLabel(this); m_labTitle->setGeometry(10, 0, 200, 60); m_labTitle->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); m_labTitle->setStyleSheet(qsLabelStyle); m_labTitle->show();
QCheckBox控件的創建
QString qsCheckStyle = "QCheckBox{color:#333333;font-family:Microsoft YaHei UI;font-size:14px;}" "QCheckBox::indicator::checked{image:url(:/QMultipleToolBarWidget/image/jd_zk_s.png)}" "QCheckBox::indicator::unchecked{image:url(:/QMultipleToolBarWidget/image/jd_sq_n.png)}"; m_check = new QCheckBox(this); m_check->setGeometry(500, 5, 50, 60); m_check->setStyleSheet(qsCheckStyle); connect(m_check, &QCheckBox::clicked, this, &QSingleTitleWidget::OnCheckShowState); m_check->show(); m_check->setChecked(false);
在標題類(QSingleTitleWidget)中需要實現QCheckBox的響應消息,通知外界該標題類對應的內容類是顯示還是隱藏狀態。
"setChecked(false)":默認窗口一創建就讓粉色窗口處于隱藏狀態。
對于QCheckBox的消息的實現,如下:
void QSingleTitleWidget::OnCheckShowState(bool checked /*= false*/) { emit Msg_SendShowState(m_nNum, checked); }
其中,m_nNum是當前標題窗口的編號,在通知外界的同時也需要告訴外界,是哪個窗口發生了變化!
補充一點:在QSingleTitleWidget類中也可以不實現QCheckBox響應消息,直接使用QWidget::mousePressEvent消息做處理,這里不再詳細說明!
自定義內容Widget
類名:QSingleContentWidget
代表了每一個單獨的內容窗口。僅有一個控件:QLabel,只是用于提示窗口的高度。
其實在實際開發中,可以展示更豐富的內容,這里只是展示了不同高度。
創建顯示高度描述控件
QString qsLabelStyle = "QLabel{color:#333333; font-family:Microsoft YaHei UI; font-size:18px;} QLabel{background-color: transparent}"; m_labContent = new QLabel(this); m_labContent->setStyleSheet(qsLabelStyle); m_labContent->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); m_labContent->show();
設置具體的高度值
void QSingleContentWidget::SetContent(int nHeight) { QString qsContent = QStringLiteral("當前窗口高度是:") + QString::number(nHeight); m_labContent->setGeometry(10, 10, 540, nHeight-20); m_labContent->setText(qsContent); }
以上1、2兩部分內容分別描述了標題widget、內容widget,下面需要創建一個承載這些內容的widget載體,將在QScrollArea中使用。
QScrollArea中widget實現
類名:QScrollAreaWidget
該類是一個承載多個標題、內容的widget,也是直接由外部調用的類。
假設:傳入一個std::vector<int>
的容器,容器的多少大小代表的是標題的個數,int值是隨機生成的高度值。
但是,到了真正業務應用中時,這里的int沒準就是一個結構體,或者是一個數據指針,無論是什么,處理方式都是一樣的。
對外開放接口:
void QScrollAreaWidget::SetScrollAreaData(std::vector<int> vetWidget) { //數據處理 }
根據vetWidget的大小創建出對應的數據組(一個標題、一個內容)
直接上全部代碼~
int nTop = 0; for (int i = 0; i < vetWidget.size(); i++) { //創建:標題 QSingleTitleWidget *widgetTitle = new QSingleTitleWidget(this); widgetTitle->setFixedSize(560, 60); widgetTitle->SetTitleContent(i); bool bShowState = i == 0 ? true : false; widgetTitle->SetShowState(bShowState); widgetTitle->show(); connect(widgetTitle, &QSingleTitleWidget::Msg_SendShowState, this, &QScrollAreaWidget::MsgReceivedTitleControlShowState); m_vetTitleWidget.push_back(widgetTitle); m_layout.addWidget(widgetTitle); nTop += 60 + 5; //創建:內容 QSingleContentWidget *widgetContent = new QSingleContentWidget(this); widgetContent->setFixedSize(QSize(560, vetWidget[i])); widgetContent->SetContent(vetWidget[i]); if (bShowState == true) { widgetContent->show(); nTop += vetWidget[i] + 5; } else { widgetContent->hide(); } m_mapContentWidget.insert(std::make_pair(i, widgetContent)); m_layout.addWidget(widgetContent); } m_layout.addStretch(0); m_layout.setSpacing(5); this->setLayout(&m_layout); m_nTotalHeight = nTop; this->setFixedSize(QSize(560, nTop));
代碼講解:
1:創建標題類:QSingleTitleWidget、創建內容類:QSingleContentWidget。
這兩個類是一對一對應的。其中,這里有個小邏輯處理,當編號是0時(也就是第一組數據時)默認處于顯示狀態。
采用了三目運算符,方便簡單:bool bShowState = i == 0 ? true : false;
并且,在創建QSingleContentWidget類時,根據是否顯示狀態來控件該類是否顯示。
2:消息處理
之前在QSingleTitleWidget類中發送了一個QCheckBox的消息,在這里就運用到該消息了。
Msg_SendShowState參數值=true時,代表展示QSingleContentWidget類內容;反之,隱藏QSingleContentWidget類的內容。
3:垂直布局應用
每創建一個新的widget,需要將widget添加到布局中:m_layout.addWidget(widgetTitle);
最后,需要在當前類中綁定布局:this->setLayout(&m_layout);
4:nTop值的意義
每創建一個類都需要對nTop進行追加,主要是為了擴大QScrollArea子窗口widget的大小,其實在使用布局后不使用也沒有關系,但是為了能夠讓我們控制widget的高度,最好主動進行設置。
QScrollArea子窗口的提升
從Qt Designer中拖出來的QScrollArea控件,默認會自帶一個widget子控件,上述3下的功能就是對子控件的重寫,那么該如何綁定呢?
選中提升后,出現下面頁面
紅框里面就是需要提升的類文件以及類名。
注意:設置了提升的類名稱后,默認頭文件會自動添加,但是該頭文件是不區分大小寫!這里一定要改成與實際的頭文件名稱保持一致!
剛開始做的時候未區分大小寫,結果找了半天才找到原因,這也跟Qt版本有關系,最好與我們提升的類一一對應!
原文鏈接:https://juejin.cn/post/7152299902473601061
相關推薦
- 2021-12-20 Win10配置Hadoop環境變量
- 2022-03-07 C語言switch語句詳解_C 語言
- 2022-04-25 C語言函數棧幀的創建與銷毀詳解_C 語言
- 2022-06-06 PowerShell yarn : 無法加載文件 C:\Users\Admin\AppData\Ro
- 2022-11-23 jQuery?validate(submitHandler函數)驗證通過發送Ajax(實例詳解)_j
- 2022-03-26 c語言實現可自定義的游戲地圖_C 語言
- 2023-12-17 eclipse中設置自動補齊代碼
- 2023-07-25 SpringBoot整合Quartz以及異步調用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支