Qt容器组件(二)之QWidgetStack、QMdiArea、QDockWidget

一、控件栈QWidgetStack(1)属性(2)常用函数(3)信号、槽(4)示例#include"mainwindow.h"#include<QApplic

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

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)示例

Qt容器组件(二)之QWidgetStack、QMdiArea、QDockWidget
Qt容器组件(二)之QWidgetStack、QMdiArea、QDockWidget

#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(0, "label0");
    pList->insertItem(1, "label1");
    pList->insertItem(2, "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,0,Qt::AlignCenter);
    pLayout->setStretchFactor(pList, 1);
    pLayout->setStretchFactor(pStackedWidget, 3);

    pWidget->setLayout(pLayout);
    w.setCentralWidget(pWidget);
    w.setWindowTitle("container test");
    w.setMinimumSize(50,50);
    w.show();
    return a.exec();
}

View Code

Qt容器组件(二)之QWidgetStack、QMdiArea、QDockWidget

二、QMdiArea多文档区域组件

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

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

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

 Qt容器组件(二)之QWidgetStack、QMdiArea、QDockWidget

(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窗口部件不 包括框架和小的工具栏。

  Qt容器组件(二)之QWidgetStack、QMdiArea、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(400,400);

    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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120086.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • critic法计算_基于CRITIC法和变异系数法的导线网测量平差定权 2[通俗易懂]

    critic法计算_基于CRITIC法和变异系数法的导线网测量平差定权 2[通俗易懂]基于CRITIC法和变异系数法的导线网测量平差定权杨腾飞,施昆,汪奇生(昆明理工大学国土资源工程学院,云南昆明650093)【摘要】CRITIC与变异系数定权都是一种客观的定权方法,能克服常规经验定权的不足。本文将这两种客观定权方法引入导线网平差中,并与常规定权方法进行比较。由应用实例可验证其优越性。【关键词】客观定权;导线网;CRITIC;变异系数【中图分类号】【文献标识码】【文章编号】Trav…

    2022年5月24日
    39
  • Android P 新特性抢先看[通俗易懂]

          上周的世界移动通信大会上,我们看到了安卓开发者,设备生产者和芯片合作者组成的安卓生态系统不断的给用户代码惊喜的体验。      新特性下面就来看看AndroidP第一个预览版的一些很酷的特性。      1,Wi-Fi室内定位      精确的室内定位一直以来都是一个挑战,它给lbs创造了新的机遇。AndroidP支持了IEEE802.11mcWi-Fi协议,…

    2022年4月14日
    42
  • cefsharp设置cookie_CefSharp 设置cookie

    cefsharp设置cookie_CefSharp 设置cookie设置cookievarcookieManager=CefSharp.Cef.GetGlobalCookieManager();awaitcookieManager.SetCookieAsync(“http://”+domain,newCefSharp.Cookie({Domain=domain,Name=name,Value=value,Expires=DateTi…

    2022年9月19日
    2
  • 软阈值 (Soft Thresholding)函数解读

    软阈值 (Soft Thresholding)函数解读版权声明:本文为博主原创文章,遵循CC4.0by-sa版权协议,转载请附上原文出处链接和本声明。…

    2022年6月5日
    34
  • 如何使用Java获取当前时间戳[通俗易懂]

    如何使用Java获取当前时间戳[通俗易懂]要获取Java中的当前时间戳:Timestamptimestamp=newTimestamp(System.currentTimeMillis());//2016-11-1606:43:19.77这是两个Java示例,向您展示如何获取Java中的当前时间戳。(使用Java8更新)1.java.sql.Timestamp获得当前java.sql.Times…

    2022年4月28日
    112
  • vue实现上传文件_vue工程如何打包部署运行

    vue实现上传文件_vue工程如何打包部署运行SpringMVC+vue实现文件上传后台前端异步上传(后端springmvc加前端vue)后台采用springmvc,实现获取到相对路径和绝对路径存储为json传到前端作为新增到数据库里的数据//文件上传@PostMapping(value=”/upLoading”)@ResponseBodypublicResult<HashMap<String,String>>upLoading(MultipartFilefile,Http

    2022年8月15日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号