我如何通过拖动调整大小句柄来折叠QDockWidget
How can I collapse QDockWidget by dragging the resize handle?
基本问题
是否可以管理分隔QDockWidgets的栏的调整大小/拖动事件?
最终目标
我试图提供一种方法来崩溃QDockWidget到0的宽度或高度通过拖动其调整大小栏过去的最小尺寸为0。因为我需要拖过最小尺寸,所以我不能只听小部件的resize事件,因为它一旦达到最小大小值就会停止。
What I've Got
我有多个QDockWidgets都停靠在一个主窗口。每个QDockWidget都有一个QT提供的调整大小句柄。对我来说,这看起来像一个QSplitter,但是当我在主窗口上执行findChildren<QSplitter *>()
时,我得到0个引用。当我内省对象时,似乎可能有一个QResizeHandler,但我找不到关于这个对象的任何文档,我认为它可能是一个私有类。
替代方案?
我愿意接受其他建议,我知道我可以很容易地在标题栏上添加一个折叠按钮,但如果可能的话,我想让它可拖动。也许我可以找到一种方法来禁用最小调整大小值,并允许用户只是调整大小为0?
我的第一个答案还可以,但它更像是一个hack而不是一个典型的设置。
最近在另一个项目中,我发现使用QSplitter
可以提供所需的功能。
基本上创建一个或多个具有设置最小大小的项目的QSplitter
,例如QLabel
或QTextEdit
等。然后尝试调整QSplitter
的大小超过最小大小。过不了多久,它就会为你崩溃。
直到最近我才知道QSplitter
的这个特性。
如果你正在使用表单,并且想要在那里添加一个QSplitter,它需要选择多个布局或小部件,然后单击适当的按钮来插入splitter。
http://www.qtcentre.org/threads/14954-QSplitter-in-Designer希望对你有帮助。
如果您右键单击任何工具栏,它可以让您取消选中/选中工具栏和dock小部件。通常为了隐藏一个dock小部件,我只在dock小部件的标题栏中使用x。
我将添加一个View
菜单项,在它下面放置工具栏,并添加一个可检查的菜单项/操作项,连接到dock小部件的显示。
将大小调整为不存在似乎有点违反直觉,或者更确切地说,在野外并不常见。(恕我直言)
更新:
https://github.com/peteristhegreat/DocksDemo 以下是相关的代码片段:允许隐藏
void CollapsableDockWidget::resizeEvent(QResizeEvent *re)
{
qDebug() << this->objectName() << this->minimumSize() << this->maximumSize() << this->size();
QList <QWidget*> children = this->findChildren<QWidget*>();
foreach(QWidget* w, children)
w->setMinimumSize(1,1);
int minWidth = 80 + 1;
int minHeight = 23 + 1;
int defaultDimension = 100;
if(re->size().width() < minWidth)
{
this->toggleViewAction()->trigger();
}
if(re->size().height() < minHeight)
{
this->toggleViewAction()->trigger();
}
}
添加到视图菜单
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QList <QDockWidget*> dockWidgets = this->findChildren<QDockWidget*>();
int count = 0;
QMenu * menu = ui->menuView;
foreach(QDockWidget* dw, dockWidgets)
{
count++;
QString dockName = "Dock Widget " + QString::number(count);
QLabel * label = dw->findChild<QLabel*>();
if(label)
label->setText(dockName);
dw->toggleViewAction()->setText(dockName);
menu->addAction(dw->toggleViewAction());
qDebug() << dw->objectName();
}
}
希望对你有帮助。
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 如何获取边缘窗口句柄 (HWND)?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 c/c++ 中打开 PhysicalDrive 的句柄并写入 MBR 的 linux 等效是什么?
- 从运行服务的应用程序代码中提取窗口句柄
- 在读取文件后重置句柄
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- Microsoft ODBC 无法创建有效的句柄
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 获取特定进程的句柄数
- C++ 创建 NdisProt 驱动程序的句柄
- 是否需要关闭来自 WinHTTP 异步的句柄?
- 句柄OK全部崩溃
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- 什么是 C# 等同于C++句柄
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 获取现有进程句柄
- GetModuleHandle() 无法检索由 "notepad.exe" 加载的"advapi32.dll"的句柄
- 更正GLSL无绑定纹理句柄中的结构布局
- 我如何通过拖动调整大小句柄来折叠QDockWidget