如何停靠弹出窗口?

2023-12-31

我有一个包含 3 个主要小部件的应用程序。我也有一个弹出窗口QDockWidget。我正在尝试获取QDockWidget停靠到底部小部件的右半部分,但正如您在下图中看到的,我可以停靠窗口的唯一位置是应用程序的边缘。我怎样才能做到这一点QDockWidget窗口占据底部小部件的右半部分?

另外,有没有办法有一个QDockWidget打开应用程序时已经停靠,而不是在自己的窗口中单独打开它?

EDIT:使用下面@Bertrand 的答案,这就是我最终要做的事情:

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
  Q_OBJECT

public:
  explicit MainWindow(QWidget *parent = 0);
  ~MainWindow();


private:
  Ui::MainWindow *ui;
  void on_actionRestore_layout_triggered();
  QMainWindow* m_rightSideWindow;
  QDockWidget* m_dockWidget1;
  QDockWidget* m_dockWidget2;
  QDockWidget* m_dockWidget3;
};

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtWidgets>

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow),
  m_rightSideWindow(NULL),
  m_dockWidget1(NULL),
  m_dockWidget2(NULL),
  m_dockWidget3(NULL)
{
  ui->setupUi(this);
  QSplitter *splitter = new QSplitter(this);
      splitter->setOrientation(Qt::Horizontal);
      QTreeView* leftSideWidget = new QTreeView(this);

      m_rightSideWindow = new QMainWindow(this);
      m_rightSideWindow->setWindowFlags(Qt::Widget);
      m_rightSideWindow->layout()->setContentsMargins(3, 3, 3, 3);

      splitter->addWidget(leftSideWidget);
      splitter->addWidget(m_rightSideWindow);

      m_dockWidget1 = new QDockWidget("Dock 1", this);
      m_rightSideWindow->addDockWidget(Qt::TopDockWidgetArea, m_dockWidget1);
      m_dockWidget1->setTitleBarWidget(new QWidget()); // remove title bar
      m_dockWidget1->setAllowedAreas(Qt::NoDockWidgetArea); // do not allow to dock
      QTextEdit* textEdit1 = new QTextEdit(this); // put any QWidget derived class inside
      m_dockWidget1->setWidget(textEdit1);

      m_dockWidget2 = new QDockWidget("Dock 2", this);
      m_rightSideWindow->addDockWidget(Qt::BottomDockWidgetArea, m_dockWidget2);
      m_dockWidget2->setTitleBarWidget(new QWidget());
      m_dockWidget2->setAllowedAreas(Qt::NoDockWidgetArea);
      QTextEdit* textEdit2 = new QTextEdit(this);
      m_dockWidget2->setWidget(textEdit2);

      m_dockWidget3 = new QDockWidget("Dock 3", this);
      m_rightSideWindow->addDockWidget(Qt::BottomDockWidgetArea, m_dockWidget3);
      QTextEdit* textEdit3 = new QTextEdit(this);
      m_dockWidget3->setWidget(textEdit3);

      setCentralWidget(splitter);
}

MainWindow::~MainWindow()
{
  delete ui;
}

void MainWindow::on_actionRestore_layout_triggered()
{
    QList<QDockWidget*> list = findChildren<QDockWidget*>();
    foreach(QDockWidget* dock, list)
    {
        if(dock->isFloating())
            dock->setFloating(false);
        m_rightSideWindow->removeDockWidget(dock);
        if (dock == m_dockWidget1)
            m_rightSideWindow->addDockWidget(Qt::TopDockWidgetArea, m_dockWidget1);
        else
            m_rightSideWindow->addDockWidget(Qt::BottomDockWidgetArea, dock);
        dock->setVisible(true);
    }
    m_rightSideWindow->splitDockWidget(m_dockWidget2, m_dockWidget3, Qt::Horizontal);
}

您可以将 QDockWidget 停靠在 QMainWindow 或另一个 QDockWidget 上。

要获得所需的布局,请在主窗口的右侧嵌入一个子 QMainWindow,并将其用作带有 setWindowFlags(Qt::Widget) 的 QWidget:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtWidgets>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QSplitter *splitter = new QSplitter(this);
    splitter->setOrientation(Qt::Horizontal);
    QTreeView* leftSideWidget = new QTreeView(this);

    m_rightSideWindow = new QMainWindow(this);
    m_rightSideWindow->setWindowFlags(Qt::Widget);
    m_rightSideWindow->layout()->setContentsMargins(3, 3, 3, 3);

    splitter->addWidget(leftSideWidget);
    splitter->addWidget(m_rightSideWindow);

    m_dockWidget1 = new QDockWidget("Dock 1", this);
    m_rightSideWindow->addDockWidget(Qt::TopDockWidgetArea, m_dockWidget1);
    m_dockWidget1->setTitleBarWidget(new QWidget()); // remove title bar
    m_dockWidget1->setAllowedAreas(Qt::NoDockWidgetArea); // do not allow to dock
    QTextEdit* textEdit1 = new QTextEdit(this); // put any QWidget derived class inside
    m_dockWidget1->setWidget(textEdit1);

    m_dockWidget2 = new QDockWidget("Dock 2", this);
    m_rightSideWindow->addDockWidget(Qt::BottomDockWidgetArea, m_dockWidget2);
    m_dockWidget2->setTitleBarWidget(new QWidget());
    m_dockWidget2->setAllowedAreas(Qt::NoDockWidgetArea);
    QTextEdit* textEdit2 = new QTextEdit(this);
    m_dockWidget2->setWidget(textEdit2);

    m_dockWidget3 = new QDockWidget("Dock 3", this);
    m_rightSideWindow->addDockWidget(Qt::BottomDockWidgetArea, m_dockWidget3);
    QTextEdit* textEdit3 = new QTextEdit(this);
    m_dockWidget3->setWidget(textEdit3);

    setCentralWidget(splitter);

}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_actionRestore_layout_triggered()
{
    QList<QDockWidget*> list = findChildren<QDockWidget*>();
    foreach(QDockWidget* dock, list)
    {
        if(dock->isFloating())
            dock->setFloating(false);
        m_rightSideWindow->removeDockWidget(dock);
        if (dock == m_dockWidget1)
            m_rightSideWindow->addDockWidget(Qt::TopDockWidgetArea, m_dockWidget1);
        else
            m_rightSideWindow->addDockWidget(Qt::BottomDockWidgetArea, dock);
        dock->setVisible(true);
    }
    m_rightSideWindow->splitDockWidget(m_dockWidget2, m_dockWidget3, Qt::Horizontal);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何停靠弹出窗口? 的相关文章

随机推荐

  • 如何使用 andengine 创建警报对话框

    我正在使用 andengine 开发游戏 现在我需要的是创建一个警报对话框 我正在用这个 case MENU OPT mEngine runOnUpdateThread new Runnable Override public void r
  • 前向模式的计算效率自动与数字与符号微分

    我正在尝试使用 C 语言中的牛顿拉夫森 NR 方法来解决求函数根的问题 我想要求根的函数大多是多项式函数 但也可能包含三角函数和对数函数 NR 方法需要求函数的微分 实现差异化有3种方式 Symbolic 数值 自动 子类型为正向模式和反向
  • NetTcpBinding 与流和会话

    我正在尝试使用 NetTcpBinding 设置 WcfService 我使用流式传输模式 因为我将传输大文件 我需要使用 Session 并且我已经读到 NetTcpBinding 支持此功能 但是当我打开它时 如下所示 SessionM
  • 使用smarty编译product.tpl时出错

    我尝试编译this http www codeshare io ywPex使用 smarty tpl 文件 我的 php 文件是this http www codeshare io Qx8uW 但我看到了错误消息 致命错误 未捕获 gt S
  • reinterpret_cast 能否将无效的指针值转换为有效的指针值?

    考虑这个联盟 union A int a struct int b c c and a不是布局兼容 https timsong cpp github io cppwp n4659 basic types 11类型 因此无法读取其值b通过a
  • 如何在不排序的情况下选择表中的最后 5 行?

    我想从 SQL Server 中的表中选择最后 5 条记录 而不按升序或降序排列表 这几乎是我写过的最奇怪的查询 但我很确定它会从表中获取 最后 5 行 而无需排序 select from issues where issueid not
  • 准备学习html5

    我是一名桌面应用程序开发人员 我计划学习 html5 但由于它尚未发布 几乎 没有出版的书籍 并且网络上没有太多适合初学者的信息 我觉得我应该从 html4 开始当前的网络开发技能 我想我应该从 html4 css 和 javascript
  • 从层次结构中的顶级类调用方法而不是覆盖

    假设我有课Base object and Derived Base 这两个都实现了一个功能foo with Derived foo覆盖版本Base 然而 在其中一种方法中 说Base learn to foo 我想打电话Base foo而不
  • 如何创建交互式选择?

    我想在Python中创建一个 交互式选择 不确定我的措辞是否正确 请看下面的示例 让用户按向上和向下键选择一个选项并返回确认它 然后继续脚本 终端中的示例输出如下所示 python script py Please select an op
  • MVC 5 未将名为“action”的参数设置为传递的值

    我有以下方法 public void Service int id string action 当我将其作为网址时 http localhost home service id 24 action updated 无论我传递给参数什么 MV
  • C# 中将 char 转换为 int

    我在 C 中有一个 char char foo 2 现在我想把 2 变成一个 int 我发现 Convert ToInt32 返回 char 的实际十进制值 而不是数字 2 以下内容将起作用 int bar Convert ToInt32
  • Android EditText 监听光标位置变化

    我有一个包含 EditText 的对话框 EditText 在创建时已被填充 当用户将光标放在文本的某些部分上或附近时 将会弹出一个 Toast 我的问题是监听光标位置的变化 其他post http stackoverflow com qu
  • 通过 Dagger 将演示者注入到 Activity 中

    我想知道如何使用代码在 Activity 中注入 Presenter 以下是详细信息 以下是错误信息 Error 12 46 error cannot find symbol class DaggerCategoryPresenterCom
  • 为什么 Twitter 和 Google API 文档不对 URL 中的 & 符号进行编码?

    I 已读过 https stackoverflow com questions 3705591 do i encode ampersands in a href我应该将我的 符号编码为 amp 在 HTML 中 然而numerous来自受人
  • 如何使用 Eclipse (CDT) 将现有项目用作新项目的模板?

    我想使用我的一个项目 其中所有内容都配置良好 以及如何开始作为 模板 工作 以便使用 CDT 在 eclipse 中创建新项目 因此可以节省配置和编写工作项目的时间 因为它已经在其他地方制作了 有什么提示吗 您始终可以右键单击该项目 选择
  • 在 React Native 中将 props 传递到外部样式表?

    我是 React 和 React Native 的新手 目前 对于每个组件 我将代码分成两个单独的文件 index js对于所有 React 代码 以及 styles js对于样式表 有没有办法将 props 传递到外部样式表中 例子 in
  • 与重复的组合

    我正在使用 Mathematica 7 和 Combinatorica 包函数 我可以从元素列表中获取特定数量的所有组合 其中顺序无关紧要并且没有重复 例如 in KSubsets a b c d 3 out a b c a b d a c
  • 如何检查仅当鼠标位于特定位置时才存在的元素

    如果您需要检查元素的悬停状态 可以按照描述完成here https stackoverflow com questions 17602611 inspect a hover element问题是如果移动鼠标就会失去状态 就我而言 它的 ja
  • 绑定Vuejs的两个组件

    如何完美地组织两个 vuejs 组件之间的数据和交互 例如 1 我有一个组件 item v for item in items a item name 2 和第二个 card v for item in items div content
  • 如何停靠弹出窗口?

    我有一个包含 3 个主要小部件的应用程序 我也有一个弹出窗口QDockWidget 我正在尝试获取QDockWidget停靠到底部小部件的右半部分 但正如您在下图中看到的 我可以停靠窗口的唯一位置是应用程序的边缘 我怎样才能做到这一点QDo