QT中有九种容器组件,分别是组合框QGroupBox、滚动区QScrollArea、工具箱QToolBox、选项卡QTabWidget、控件栈QWidgetStack、框架QFrame、组件QWidget、MDI窗口显示区QMdiArea、停靠窗口QDockWidget。
本博主要介绍:组合框QGroupBox、滚动区QScrollArea、工具箱QToolBox、选项卡QTabWidget

一、控件栈QWidgetStack

(1)属性

class Q_WIDGETS_EXPORT QStackedWidget : public QFrame
{
Q_OBJECT Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentChanged)
Q_PROPERTY(int count READ count)
。。。。。。。。。。。。。。。

(2)常用函数

    int addWidget(QWidget *w);
int insertWidget(int index, QWidget *w);
void removeWidget(QWidget *w); QWidget *currentWidget() const;
int currentIndex() const; int indexOf(QWidget *) const;
QWidget *widget(int) const;
int count() const;

(3)信号、槽

public Q_SLOTS:
void setCurrentIndex(int index);
void setCurrentWidget(QWidget *w); Q_SIGNALS:
void currentChanged(int);
void widgetRemoved(int index);

(4)示例

#include "mainwindow.h"
#include <QApplication>
#include <QListWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QStackedWidget>
#include <QObject> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w; QWidget *pWidget = new QWidget(&w);
QHBoxLayout *pLayout = new QHBoxLayout(pWidget);
QStackedWidget *pStackedWidget = new QStackedWidget(pWidget); QListWidget* pList = new QListWidget(pWidget);
pList->insertItem(, "label0");
pList->insertItem(, "label1");
pList->insertItem(, "label2"); QLabel* pLabel0 = new QLabel("label0 test");
QLabel* pLabel1 = new QLabel("label1 test");
QLabel* pLabel2 = new QLabel("label2 test");
pStackedWidget->addWidget(pLabel0);
pStackedWidget->addWidget(pLabel1);
pStackedWidget->addWidget(pLabel2);
w.connect(pList, SIGNAL(currentRowChanged(int)), pStackedWidget, SLOT(setCurrentIndex(int))); pLayout->addWidget(pList);
pLayout->addWidget(pStackedWidget,,Qt::AlignCenter);
pLayout->setStretchFactor(pList, );
pLayout->setStretchFactor(pStackedWidget, ); pWidget->setLayout(pLayout);
w.setCentralWidget(pWidget);
w.setWindowTitle("container test");
w.setMinimumSize(,);
w.show();
return a.exec();
}

二、QMdiArea多文档区域组件

  QMdiArea组件中文称作“MDI窗口显示区”,MDI是 Multiple Document Interface的简称,中文意思是多文档界面,主要适用于完成一项工作时需要用到多个文件。QMainWindow是SDI(Signal Document Interface,单文档界面)每个开启的文件占据一个视窗,主要适用于所有工作没有太多文件参与的情况。

QMdiSubWindow类继承自QWidget,主要用来创建MDI子窗体实例

 QtExmaple中提供了相应的例子:\Examples\Qt-5.9.3\widgets\mainwindows\mdi

 

(1)属性

  背景、窗口顺序(SubWindowList)、视图模式(SubWindowView/tabbedView)、tabsClosable、tabsMovable、TabPositionTabShape

class Q_WIDGETS_EXPORT QMdiArea : public QAbstractScrollArea
{
Q_OBJECT
Q_PROPERTY(QBrush background READ background WRITE setBackground)
Q_PROPERTY(WindowOrder activationOrder READ activationOrder WRITE setActivationOrder)
Q_PROPERTY(ViewMode viewMode READ viewMode WRITE setViewMode)
#if QT_CONFIG(tabbar)
Q_PROPERTY(bool documentMode READ documentMode WRITE setDocumentMode)
Q_PROPERTY(bool tabsClosable READ tabsClosable WRITE setTabsClosable)
Q_PROPERTY(bool tabsMovable READ tabsMovable WRITE setTabsMovable)
#endif
#if QT_CONFIG(tabwidget)
Q_PROPERTY(QTabWidget::TabShape tabShape READ tabShape WRITE setTabShape)
Q_PROPERTY(QTabWidget::TabPosition tabPosition READ tabPosition WRITE setTabPosition)
。。。。。。。。。。。

(2)常用函数、信号、槽

  QSize sizeHint() const Q_DECL_OVERRIDE;
QSize minimumSizeHint() const Q_DECL_OVERRIDE; QMdiSubWindow *currentSubWindow() const;
QMdiSubWindow *activeSubWindow() const;
QList<QMdiSubWindow *> subWindowList(WindowOrder order = CreationOrder) const; QMdiSubWindow *addSubWindow(QWidget *widget, Qt::WindowFlags flags = Qt::WindowFlags());
void removeSubWindow(QWidget *widget); QBrush background() const;
void setBackground(const QBrush &background); WindowOrder activationOrder() const;
void setActivationOrder(WindowOrder order); void setOption(AreaOption option, bool on = true);
bool testOption(AreaOption opton) const; void setViewMode(ViewMode mode);
ViewMode viewMode() const;
Q_SIGNALS:
void subWindowActivated(QMdiSubWindow *); public Q_SLOTS:
void setActiveSubWindow(QMdiSubWindow *window);
void tileSubWindows();
void cascadeSubWindows();
void closeActiveSubWindow();
void closeAllSubWindows();
void activateNextSubWindow();
void activatePreviousSubWindow(); protected Q_SLOTS:
void setupViewport(QWidget *viewport) Q_DECL_OVERRIDE;

(3)示例

  :\Examples\Qt-5.9.3\widgets\mainwindows\mdi

(4)注意Mdi子窗口的关闭

void MainWindow::closeEvent(QCloseEvent *event)
{
m_pMdiArea->closeAllSubWindows();
if (m_pMdiArea->currentSubWindow()) {
event->ignore();
} else {
event->accept();
}
}

三、QDockWidget停靠窗口

  QDockWidget停靠窗体组件,可以作为一个顶层窗口漂浮在桌面,主要作为辅助窗体出现在界面中,可以在很多IDE中看到停靠窗体。

QDockWidget包含工具栏和内容区域,工具栏用于显示窗口标题,一个浮动按钮和一个关闭按钮。QDockWidget可以作为子窗口部件的封装,通过setWidget()设置子窗口部件。自定义的尺寸提示,最小和最大化尺寸以及尺寸策略都必须由子窗口部件来实现。QDockWidget会遵守它们,调整它自己的限制包括框架和工具栏。我们不应该为QDockWidget设置尺寸限制,因为它们根据QDockWidget是否锁住而改变,一个锁住的QDockWidget窗口部件不 包括框架和小的工具栏。

  

(1)属性

  属性包括:是否悬浮、停靠窗口特征(移动,关闭,悬浮)、停靠区域、窗口标题

class Q_WIDGETS_EXPORT QDockWidget : public QWidget
{
Q_OBJECT Q_PROPERTY(bool floating READ isFloating WRITE setFloating)
Q_PROPERTY(DockWidgetFeatures features READ features WRITE setFeatures NOTIFY featuresChanged)
Q_PROPERTY(Qt::DockWidgetAreas allowedAreas READ allowedAreas
WRITE setAllowedAreas NOTIFY allowedAreasChanged)
Q_PROPERTY(QString windowTitle READ windowTitle WRITE setWindowTitle DESIGNABLE true)
。。。。。。。。。。。。。。。。。

  窗口特征枚举:

enum DockWidgetFeature {
DockWidgetClosable = 0x01,
DockWidgetMovable = 0x02,
DockWidgetFloatable = 0x04,
DockWidgetVerticalTitleBar = 0x08, DockWidgetFeatureMask = 0x0f,
AllDockWidgetFeatures = DockWidgetClosable|DockWidgetMovable|DockWidgetFloatable, // ### Qt 6: remove
NoDockWidgetFeatures = 0x00, Reserved = 0xff
};

(2)信号、槽

Q_SIGNALS:
void featuresChanged(QDockWidget::DockWidgetFeatures features);
void topLevelChanged(bool topLevel);
void allowedAreasChanged(Qt::DockWidgetAreas allowedAreas);
void visibilityChanged(bool visible);
void dockLocationChanged(Qt::DockWidgetArea area); protected:
void changeEvent(QEvent *event) Q_DECL_OVERRIDE;
void closeEvent(QCloseEvent *event) Q_DECL_OVERRIDE;
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
bool event(QEvent *event) Q_DECL_OVERRIDE;
void initStyleOption(QStyleOptionDockWidget *option) const;

(3)示例

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
//ui(new Ui::MainWindow)
{
setWindowTitle("MDI test");
setMinimumSize(,); m_pFileAction = new QAction("open", this); m_pFileMenu = menuBar()->addMenu("File");
m_pFileMenu->addAction(m_pFileAction);
connect(m_pFileAction, SIGNAL(triggered(bool)), this, SLOT(openView())); m_pMdiArea = new QMdiArea(this);
m_pMdiArea->setViewMode(QMdiArea::TabbedView);
m_pMdiArea->setTabShape(QTabWidget::Triangular);
m_pMdiArea->setTabPosition(QTabWidget::North);
m_pMdiArea->setTabsMovable(true);
m_pMdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
m_pMdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); setCentralWidget(m_pMdiArea); QDockWidget* pDockWidget = new QDockWidget("dockwindow", this);
pDockWidget->setFeatures(QDockWidget::DockWidgetFeature::AllDockWidgetFeatures);
QWidget* pWidget = new QWidget(this);
QVBoxLayout *pLayout = new QVBoxLayout(pWidget);
QPushButton *pOkBtn = new QPushButton("ok");
QPushButton *pCancelBtn = new QPushButton("cancel");
pLayout->addWidget(pOkBtn);
pLayout->addWidget(pCancelBtn); pDockWidget->setWidget(pWidget); addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea, pDockWidget);
}

Qt容器组件(二)之QWidgetStack、QMdiArea、QDockWidget的更多相关文章

  1. Qt容器组件(一)之QGroupBox、QScrollArea、QToolBox、QTabWidget

    QT中有九种容器组件,分别是组合框QGroupBox.滚动区QScrollArea.工具箱QToolBox.选项卡QTabWidget.控件栈QWidgetStack.框架QFrame.组件QWidg ...

  2. 第15.38节 PyQt(Python+Qt)入门学习:containers容器类部件QDockWidget停靠窗功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QDockWidget类提供了一个可以停靠在QMainWin ...

  3. Castle IOC容器组件生命周期管理

    主要内容 1.生命处理方式 2.自定义生命处理方式 3.生命周期处理 一.生命处理方式 我们通常创建一个组件的实例使用new关键字,这样每次创建出来的都是一个新的实例,如果想要组件只有一个实例,我们会 ...

  4. 跟着刚哥学习Spring框架--Spring容器(二)

    Spring容器 启动Spring容器(实例化容器) -- IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化(加载启动),这样才可以从容器中获取Bean的实例并使用.  Bean是S ...

  5. 安卓程序代写 网上程序代写[原]ViewGroup(容器组件)详解(API解析)

    一. ViewGroup简介 1.View和ViewGroup关系 UI组件在Android中的位置 : Android中的UI组件大部分都放在android.widget 或者 android.vi ...

  6. Qt Quick 组件与动态对象

    博客24## 一.Components(组件) Component 是由 Qt 框架或开发者封装好的.只暴露了必要接口的 QML 类型,可以重复利用.一个 QML 组件就像一个黑盒子,它通过属性.信号 ...

  7. Qt计算器开发(二):信号槽实现数学表达式合法性检查

    表达式的合法性 由于我们的计算器不是单步计算的,所以我们能够一次性输入一个长表达式.然而假设用户输入的长表达式不合法的话,那么就会引发灾难.所以有必要对于用户的输入做一个限制. 一些限制举例: 比方, ...

  8. Qt Quick 组件和动态创建的对象具体的解释

    在<Qt Quick 事件处理之信号与槽>一文中介绍自己定义信号时,举了一个简单的样例.定义了一个颜色选择组件,当用户在组建内点击鼠标时,该组件会发出一个携带颜色值的信号,当时我使用 Co ...

  9. React-UI组件和容器组件

    UI组件负责页面的渲染,又叫傻瓜组件. 容器组件负责逻辑,又叫聪明组件. 当一个组件只有render函数的时候,就可以用无状态组件的形式来定义这个组件.无状态组件怎么定义呢?其实就是一个函数,接受pr ...

随机推荐

  1. Iconfot阿里妈妈-css高级应用

    矢量图标替换教程 首先进入:http://www.iconfont.cn/ 搜索你分类的关键字---然后加入购物车 加入购物车之后,下载到本地用浏览器打开demo.html 把a class=“原来样 ...

  2. Kindeditor上传图片回显不出来

    原因之一: 图片成功上传但是回显不出来,这个时候,要检查返回的图片地址是否加了http://这个玩意,不然会将原来的头加上图片返回地址.

  3. 【Python基础】之异常

    一.常见异常 try: open('abc.txt','r') except FileNotFoundError: print('异常啦!') 输出结果: ======= 异常啦! 我们通过 open ...

  4. ASP.NET动态网站制作(7)-- JS(2)

    前言:这节课是JS的第二节课,主要是JS中的控制语句. 内容: 1.条件语句:  (1)比较操作符:==,!=,>,>=,<,<=.字符串大小写转换:toUpperCase() ...

  5. 【BZOJ3217】ALOEXT 替罪羊树+Trie树

    [BZOJ3217]ALOEXT Description taorunz平时最喜欢的东西就是可移动存储器了……只要看到别人的可移动存储器,他总是用尽一切办法把它里面的东西弄到手. 突然有一天,taor ...

  6. Something Starts While Something Ends

    (1)最终还是没能参加比赛,一次都没有机会. (2)有梦想,不到最后一刻不会放弃. (3)这里应该会搬次家,转到github上. (4)作为一个新手,什么东西都需要从头学起来,就从最基础的数据结构开始 ...

  7. Angular入门(四) Router 替换当前页面

    1.在 xx.html 中直接 写标签       <a [routerLink]="['/home']">home</a>   2.在 xx.html 中 ...

  8. 九度OJ 1036:Old Bill (老比尔) (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2691 解决:1432 题目描述: Among grandfather's papers a bill was found.     72 ...

  9. HTML 学习笔记 JQuery(盒子操作)

    这边博客详细的讲述一下JQuery中关于盒子模型的一些方法 offset([coordinates])方法 获取匹配元素在当前适口的相对偏移 返回的对象包含两个模型属性:top和left 以像素计.此 ...

  10. SQL2005数据库放在C盘,结果C盘满了,怎么搞到D盘

    首先,你需要将自己所建立的数据库从SQL2005中分离出来,然后按照自己的存储路径找到自己所建数据库存储的位置,把它剪切到D盘就可以了.(mdf,ldf都应该考过去,自己建立路径存储就可以,再次打开的 ...