标签: qdockwidget

C++以编程方式调整停靠的Qt QDockWidget的大小?

我刚刚开始研究一个新的C++/Qt项目.它将是一个基于MDI的IDE,带有停靠的小部件,用于文件树,对象浏览器,编译器输出等等.但是到目前为止,有一件事让我烦恼:我无法弄清楚如何以编程方式QDockWidget缩小.例如,此代码段创建了我的底部停靠窗口"构建信息":

m_compilerOutput = new QTextEdit;
m_compilerOutput->setReadOnly(true);
dock = new QDockWidget(tr("Build Information"), this);
dock->setWidget(m_compilerOutput);
addDockWidget(Qt::BottomDockWidgetArea, dock);
Run Code Online (Sandbox Code Playgroud)

启动时,我的程序看起来像这样(记住开发的早期阶段):

实际

但是,我希望它看起来像这样:

预期

我似乎无法实现这一点.QDockWidget上的Qt参考说明了这一点:

应在子窗口小部件中实现自定义大小提示,最小和最大大小和大小策略.QDockWidget将尊重它们,调整自己的约束以包含框架和标题.不应在QDockWidget本身上设置大小约束,因为它们会根据是否停靠而更改

现在,这表明执行此操作的一种方法是子类QTextEdit并覆盖该sizeHint()方法.但是,我不想仅仅为此目的这样做,我也没有尝试过它来找到一个有效的解决方案.

我试过打电话dock->resize(m_compilerOutput->width(), m_compilerOutput->minimumHeight()),m_compilerOutput->setSizePolicy()用它的每个选项打电话......到目前为止,没有任何东西影响了它的大小.就像我说的,我更喜欢在几行代码中使用一个简单的解决方案来创建一个只是为了改变的子类sizeHint().所有建议表示赞赏.

c++ qt resize qdockwidget

26
推荐指数
4
解决办法
3万
查看次数

与Qt 4.8相比,为什么FlowLayout在Qt 5.2中的表现不同?

我刚刚将我的应用程序从Qt 4.8.4移植到Qt 5.2.1.我在Qt文档FlowLayout中的FlowLayout示例代码中提供了类的问题.

我有QMainWindow一个QDockWidget停靠在中央部件的底部.该QDockWidgetFlowLayout几个子部件.在Qt 4.8中,这就像一个魅力,儿童小工具的大小符合标准尺寸DockWidget.但是,在Qt 5.2中,DockWidget尝试将其大小增加到最大值(从中央小部件取代).更改其布局可防止此不良行为.但当然,我FlowLayout是故意使用的.

为了说明这个问题,我创建了一个最小的例子:

构造函数DockWidget:

    QGroupBox *generalBox = new QGroupBox("");
    generalBoxLayout = new FlowLayout;
    generalBox->setLayout(generalBoxLayout);

    for(int i=0; i<10; ++i)
    {
        QPushButton *button = new QPushButton("Test", this);
        button->setMinimumWidth(100);
        button->setMinimumHeight(100);
        generalBoxLayout->addWidget(button);
    }

    this->setWidget(generalBox);
Run Code Online (Sandbox Code Playgroud)

有人知道问题是什么以及我如何解决它?

编辑 我创建了一个新的最小工作示例,遗憾的是无法重现Qt 4.8和Qt 5.2之间的差异.同样的问题出现在Qt 4.8中,所以我仍然想在这里介绍它:

显示底部停靠的dockwidget占据整个垂直空间的初始视图: 显示底部停靠的dockwidget的初始视图

使用鼠标调整dockwidget的大小后查看 使用鼠标调整dockwidget的大小后查看

使用鼠标调整主窗口大小后查看 使用鼠标调整主窗口大小后查看

这些屏幕截图显示,在手动更改dockwidget的大小后,dockwidgets的行为与预期一致.但是,在初始化时,窗口小部件从中央窗口小部件获取所有可用空间,这是不希望的.

有人知道解决方案/解决方法吗?

qt qt4 flowlayout qdockwidget qt5

26
推荐指数
1
解决办法
2108
查看次数

QDockWidget可拖动选项卡

我正在使用QDockWidgets并将其中两个放在我的应用程序的左侧,以便可以使用选项卡在它们之间进行选择.但是,Qt的默认行为看起来很可怕而且不直观.它不是能够拖动选项卡来移动窗口小部件,而是在选定的选项卡(具有相同名称)下面放置另一个栏,而不是必须拖动它.作为用户,很难搞清楚这一点.

在此输入图像描述

(我的QDockWidgets是"属性"和"库")

有没有办法摆脱这第二个栏,并使其能够通过拖动标签本身来移动我的QDockWidgets?

c++ qt tabs qdockwidget

19
推荐指数
2
解决办法
1万
查看次数

QDockWidget的初始宽度

如何设置QDockWidget的初始宽度?

我已经实现了sizeHint函数,但下一步是什么?

c++ qt qdockwidget

14
推荐指数
2
解决办法
1万
查看次数

调整QDockWidget的大小

我有一个QMainWindow包含几个QDockWidgets.一次只能显示其中一个.我的问题是:

当我隐藏dockWidget并显示另一个时,无论我设置了什么QSizePolicys,sizeHint,sizeConstraint,新显示的大小都与刚隐藏的大小相同!我想新所示,以恢复自己的最后大小,但我无法找到一个调整的任何方法QDockWidget,而不固定它的大小setMinimumSizesetMaximumSize.

事实上有一种方法,但我认为它非常难看:

setMinimumWidth(500);
setMaximumWidth(500);
qApp().processEvents();
setMinimumWidth(0);
setMaximumWidth(9999);
Run Code Online (Sandbox Code Playgroud)

肯定有更好的办法?!有什么建议?

c++ user-interface qt qdockwidget

11
推荐指数
1
解决办法
4649
查看次数

如何避免QMainWindow中太多dockwidgets的丑陋重叠?

在我们的应用程序中,我们有可变数量的dockwidgets,因为其中一些是由在运行时加载的插件添加的.并非所有dockwidgets都必须同时可见.这在很大程度上取决于用户正在处理什么以及哪些插件处于活动状态.

但是,如果以编程方式添加太多的dockwidgets addDockWidget(...),它们会开始相互重叠(不是在标签方面,而是根据在不同区域上绘制的一个内容,这显然看起来很糟糕).

重叠的dockwidgets

用户可以将dockwidgets移动到仍留有空间的 dockareas ,但布局/主窗口成功阻止(未被攻击)重新添加到"拥挤"的dockarea.

我们允许标签式底座允许用户安排所需的dockwidgets,但是我们不想启用,QMainWindow::ForceTabbedDocks因为这会过多地限制同时可见的dockwidgets的数量(每个dock区域一个).

如何防止这种情况或更好地控制如何添加dockwidgets?

c++ qt qdockwidget

8
推荐指数
1
解决办法
2978
查看次数

如何捕获QDockWidget关闭按钮单击事件

我有一个QStackedWidge内部的T QDockWidget-取决于哪个页面显示我想要显示/隐藏的关闭按钮QDockWidget.我可以通过使用来做到这一点QDockWidget::setFeatures().

然而,我面临的问题是如何捕获关闭按钮的信号,以便我可以更改停靠功能/设置堆叠的小部件页面索引.

QDockWidget关闭按钮

我试图使用事件过滤器:

class EventFilter : public QObject
{
    Q_OBJECT
public:
    EventFilter( QObject* aParent );
protected:
    bool eventFilter(QObject *obj, QEvent *event);
};

EventFilter::EventFilter( QObject* aParent )
    : QObject( aParent )
{

}

bool EventFilter::eventFilter( QObject *obj, QEvent *event )
{
    if ( event->type() == QEvent::Close )
    {
        return true;
    }
    return QObject::eventFilter( obj, event );
}
Run Code Online (Sandbox Code Playgroud)

并安装如下:

EventFilter* filter = new EventFilter( this );
u->dockWidget_6->installEventFilter( filter );
Run Code Online (Sandbox Code Playgroud)

在我的构造函数中QMainWindow- 该eventFilter() …

c++ qt qdockwidget

8
推荐指数
1
解决办法
5583
查看次数

在Qt Designer中删除Dock Widget?

我添加(通过拖放)a QDockWidget到我在GUI中编辑的GUI ...
现在我想删除它.

首先,我选择了可​​见物体并按下了Delete键.
物体消失了.

但是,QDockWidget可以看到对象检查器中仍然存在,
当我尝试保存我的时.ui,我收到消息:

The container extension of the widget MainWindow (QMainWindow)
returned a widget not managed by Designer dockWidget (QDockWidget)
when queried for page #2. Container pages should only be added by
specifying them in XML returned by the domXml() method of the custom
widget.
Run Code Online (Sandbox Code Playgroud)

单击Object Inspector中的Widget并点击Delete键不会执行任何操作,
右键单击上下文菜单没有通常的"Remove"选项.
我怎么摆脱它?!:|

眼镜:

Windows 7 32 bit  
PyQt4
Run Code Online (Sandbox Code Playgroud)

qt designer qdockwidget

7
推荐指数
1
解决办法
3327
查看次数

QDockWidget showFullscreen无法在Ubuntu(gnome)上运行

我正试图将浮动(未对接的)QDockWidget置于全屏模式.在Windows上,一切都很简单.例如,我将dockwidget(dw)的topLevelChanged()信号连接到自定义槽floatingChanged()

connect(dw, SIGNAL(topLevelChanged(bool)), this, SLOT(floatingChanged(bool)));
Run Code Online (Sandbox Code Playgroud)

在插槽内我检查:如果dw浮动并调用dw-> showFullscreen().

void MainWindow::floatingChanged(bool floating)
{
    if( floating )
    {
        QDockWidget* dw = static_cast<QDockWidget*>(QObject::sender());
        dw->showFullScreen();
    }
}
Run Code Online (Sandbox Code Playgroud)

在Windows中,未对接(浮动)QDockWidget在取消停靠后直接切换到全屏模式.但是在linux下(ubuntu 12.04,gnome-shell 3.4.1)这不起作用(qt 4.8.0).停靠小部件只是保持正常模式.

我无法弄清楚如何将(浮动)QDockWidget切换到全屏模式.任何解决方案都非常受欢迎.实际上,不同的操作系统在此目的上表现不同.

我已经在网上搜索没有成功,所以这是我在这里的第一篇文章.请原谅我拼写错误我不是母语英语,thanx;)

ps我也会尝试osx-lions行为.顺便说一下:要试一试,只需在Qt示例http://qt-project.org/doc/qt-5.0/qtwidgets/mainwindows-mainwindow.html的MainWindow中实现上面显示的floatingChanged()插槽并连接它使用任何现有的dockwidgets或MainWindow :: createDockWidget()方法.

c++ ubuntu qt4 fullscreen qdockwidget

7
推荐指数
1
解决办法
801
查看次数

在QMainWindows之间拖动QDockWidgets

我有一个关于在QMainWindows之间拖动QDockWidgets的问题.我有一个具有不同"DockAreas"的应用程序,它有一个带有一个或多个QDockWidgets的QMainWindow成员.另外,我想让QDockWidgets可以拖放到其他已经浮动的QDockWidgets(没有标签!).

为了在拖放时获得漂亮的悬停效果,浮动QDockWidgets嵌入到具有QMainWindow成员的DockArea的新实例中.现在我拦截拖动的QDockWidget的mousemove事件,并在它悬停在我的DockArea的另一个QMainWindow时更改其父级.不幸的是,这会导致崩溃,看起来这个QDockWidget所在的原始QLayoutItem已经消失了.

void QDockWidgetPrivate::moveEvent(QMoveEvent *event)
{
    // ...
    // now this widgetItem member of state is kaputt
    layout->hover(state->widgetItem, globalMousePos);
}
Run Code Online (Sandbox Code Playgroud)

我发现了在互联网上QMainWindows之间拖放QDockWidgets的不同建议:

1)重新养育 - 这就是我正在尝试的东西

2)QDrag - 对我不起作用,async exec()打破了我的应用程序,最后我还是要重新调试

3)调用新QMainWindow的addDockWidget(...) - 停靠QDockWidget,我将不得不再次浮动并以某种方式"继续拖动"

我对任何新建议持开放态度:)提前谢谢!

c++ qt drag-and-drop qdockwidget qt5

7
推荐指数
1
解决办法
362
查看次数