PyQt程序员

4.5 停靠窗口

2019-01-06  本文已影响8人  223480235e8e

今天小豆君来分享下Qt的停靠窗口QDockWidget。

QDockWidget可以停靠在QMainWindow内,或者作为桌面的顶层窗口。

QDockWidget一般会作为工具面板或实用工具窗口。比较类似与我们vs中的查找替换窗口。

image

QDockWidget由标题栏和内容区域组成。标题栏显示窗口标题、浮动按钮和关闭按钮。

4.5.1 属性

QDockWidget继承于QWidget。

image

1 allowedAreas 规定了悬停窗口可以被放置在哪些区域

这个属性是QFlags<DockWidgetArea>的,也就是说彼此之间可以使用或运算符(|),取并集。

2 features 窗口标识

这个属性也是QFlags<DockWidgetFeature>的。

3 floating 是否处于浮动状态

为true时,其作为独立的窗口呈现给用户,而不是被停靠在QMainWindow上。

4 windowTitle 窗口标题

4.5.2 常用函数

4.5.3 示例

新建项目MainWindowDock,类名MainWindowDock,继承于QMainWindow

在ui界面拖入四个QDockWidget,并分别命名为上侧,下侧,左侧,右侧。

在中心窗口区域拖入一个QTabWidget,第一页标题为allowedAreas,并在里面拖入一个QListWidget,并新增四个item。同理编辑第二页features,如图二。

image image

mainwindow.h

#ifndef MAINWINDOWDOCK_H
#define MAINWINDOWDOCK_H
#include <QMainWindow>

namespace Ui {
class MainWindowDock;
}
class QListWidgetItem;
class MainWindowDock : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindowDock(QWidget *parent = 0);
    ~MainWindowDock();
private slots:
    void on_listWidget_areas_itemChanged(QListWidgetItem *item);
    void on_listWidget_features_itemChanged(QListWidgetItem *item);
private:
    Ui::MainWindowDock *ui;
};
#endif // MAINWINDOWDOCK_H

mainwindow.cpp

#include "mainwindowdock.h"
#include "ui_mainwindowdock.h"
MainWindowDock::MainWindowDock(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindowDock)
{
    ui->setupUi(this);
}
MainWindowDock::~MainWindowDock()
{
    delete ui;
}
void MainWindowDock::on_listWidget_areas_itemChanged(QListWidgetItem *item)
{
    //获取该item所代表的位置flag
    int row = ui->listWidget_areas->row(item);
    int flg = Qt::LeftDockWidgetArea << row;

    //获取停靠窗口原来的位置flag,并设置新的可放置区域
    QList<QDockWidget *> allDocks = findChildren<QDockWidget *>();
    foreach (QDockWidget* dock, allDocks)
    {
         Qt::DockWidgetAreas areas = dock->allowedAreas();
         areas.setFlag((Qt::DockWidgetArea)flg, item->checkState() == Qt::Checked);
         dock->setAllowedAreas(areas);
    }
}
void MainWindowDock::on_listWidget_features_itemChanged(QListWidgetItem *item)
{
    //获取该item所代表的停靠窗口标识
    int row = ui->listWidget_features->row(item);
    int flg = QDockWidget::DockWidgetClosable << row;

    //获取停靠窗口原来的窗口flag,并设置新的标识
    QList<QDockWidget *> allDocks = findChildren<QDockWidget *>();
    foreach (QDockWidget* dock, allDocks)
    {
         QDockWidget::DockWidgetFeatures features = dock->features();
         features.setFlag((QDockWidget::DockWidgetFeature)flg, item->checkState() == Qt::Checked);
         dock->setFeatures(features);
    }
}

现在我们来编译运行程序,并且勾选不同的属性,拖拽移动停靠窗口,看看都有哪些变化。

下图展示停靠窗口位于左侧并且标题垂直排列

image

下图展示左侧和右侧停靠窗口重叠在一起,上下侧窗口悬浮。

image

好的,今天的分享就到这里啦,最后也希望大家多多支持小豆君的创作,关注小豆君的公众号“小豆君Qt分享”,最新文章都会在公众号第一时间发布,或者你有不懂的问题,关注公众号后,可加好友或进Qt群获得答案。

上一篇 下一篇

猜你喜欢

热点阅读