我在 QDockWidget
中有一个简单的 QWidget
和我自己的这个停靠小部件的标题栏。在此标题栏中,我放置了一个 QPushButton
,当它被触发时,它允许我:
- 设置标题栏垂直
- 将小部件隐藏在
QDockWidget
中
我设法让它们分开工作,但我无法同时成功。
这是标题栏的代码:
QDockTitleBar::QDockTitleBar(const QString &title, QDockWidget * parent)
: QWidget(parent)
{
pDock = qobject_cast<QSuiteDockWidget*>(parentWidget());
m_pMainLayout = new QHBoxLayout(this);
m_pLabel = new QLabel(title, this);
m_pMainLayout->addWidget(m_pLabel);
m_pMainLayout->addStretch();
m_pToggleButton = new QPushButton(this);
//m_pToggleButton->setIcon(...); // whatever
m_pToggleButton->setFlat(true);
connect(m_pToggleButton, SIGNAL(clicked()), this, SLOT(toggleButtonTriggered()));
m_pMainLayout->addWidget(m_pToggleButton);
}
void QDockTitleBar::resizeEvent(QResizeEvent* event)
{
if (pDock->features() & QDockWidget::DockWidgetVerticalTitleBar)
qDebug() << "I am Vertical";
else
qDebug() << "I am Horizontal";
}
void QDockTitleBar::toggleButtonTriggered()
{
const QDockWidget::DockWidgetFeatures features = pDock->features();
if(features & QDockWidget::DockWidgetVerticalTitleBar)
{
pDock->widget()->show(); // comment this one...
pDock->setFeatures(features ^ QDockWidget::DockWidgetVerticalTitleBar);
}
else
{
pDock->widget()->hide(); //... and this one : the title bar is set vertical
pDock->setFeatures(features | QDockWidget::DockWidgetVerticalTitleBar);
}
}
在我的主要功能中:
QDockWidget* dock = new QDockWidget();
dock->setWindowTitle("DOCK");
QDockTitleBar* labelDock = new QDockTitleBar("DOCK", dock);
QWidget* widget = new QWidget(dock);
dock->setTitleBarWidget(labelDock);
dock->setWidget(widget);
addDockWidget(Qt::RightDockWidgetArea, dock);
注意:如果我改变 pDock->widget()->hide()
in pDock->widget() ->show()
反之亦然,我几乎有想要的行为,但是当标题栏是水平的时候小部件是隐藏的(我希望它在标题栏是垂直的时候隐藏)。 .
我还放置了 resizeEvent()
。当我触发按钮时,标题栏水平,我有:
I am Vertical
I am Horizontal
I am Horizontal
如果我再次触发按钮:
I am Vertical
I am Horizontal
I am Horizontal
I am Horizontal
任何人都可以向我解释这种行为和/或告诉我我做错了什么以及如何解决它吗?
编辑:如果重要的话,我在 Qt5.6 上工作。
我不关注 resizeEvent()
是否被调用,这只是不想要的行为。目前:
1/如果我使用这段代码:
if(features & QDockWidget::DockWidgetVerticalTitleBar)
pDock->setFeatures(features ^ QDockWidget::DockWidgetVerticalTitleBar);
else
pDock->setFeatures(features | QDockWidget::DockWidgetVerticalTitleBar);
它按预期工作:当按钮被触发时,标题栏设置为垂直,当我再次触发按钮时,标题栏设置为水平。另外,小部件始终显示。
2/如果我使用这段代码:
if(features & QDockWidget::DockWidgetVerticalTitleBar)
{
pDock->widget()->show();
pDock->setFeatures(features ^ QDockWidget::DockWidgetVerticalTitleBar);
}
else
{
pDock->widget()->hide();
pDock->setFeatures(features | QDockWidget::DockWidgetVerticalTitleBar);
}
然后,如果我触发该按钮,该小部件将被隐藏(按需要),但标题栏未设置为垂直。如果我再次触发该按钮,该小部件将显示(根据需要),标题栏仍然是水平的(看起来很正常,因为它在第一次触发时没有改变)。
3/如果我使用此代码(这是行为似乎接近我想要的地方):
if(features & QDockWidget::DockWidgetVerticalTitleBar)
{
pDock->widget()->hide();
pDock->setFeatures(features ^ QDockWidget::DockWidgetVerticalTitleBar);
}
else
{
pDock->widget()->show();
pDock->setFeatures(features | QDockWidget::DockWidgetVerticalTitleBar);
}
然后:
- 第一次触发:标题栏设置为垂直(没问题)但小部件仍然显示
- 第二次触发:标题栏回到水平但这次隐藏了小部件
- 第三次触发,之后:显示小部件的垂直标题栏,然后隐藏小部件的水平标题栏。我想要相反的东西,即标题栏垂直/小部件隐藏和标题栏水平/小部件显示。
最佳答案
首先,我尝试用 qt4.86 和 qt5.5.1 编译您的示例。他们的行为有点不同。使用 qt4.86 我认为它工作正常。但是对于 qt5.5.1,它确实如您所描述的那样显示“我是水平的”。我不知道它们为什么不同,但它们确实如此。
顺便说一下,当我从主窗口中分离 QDockWidget
时,它可以在 qt4.86 和 qt5.5.1 上工作。
所以我认为它以您意想不到的方式工作,因为您认为,当您隐藏小部件时,QDockTitleBar::resizeEvent
肯定会被调用。但这并不总是正确的。比如你的隐藏控件的宽度不是很大,所以你的dockwidget的宽度由titlebar的宽度决定,那么qt5.5.1的resizeEvent
就不会被调用。如果您希望您的QDockTitleBar::resizeEvent
在显示/隐藏您的小部件后始终被调用,您可以显式调用QCoreApplication::sendEvent (QObject * receiver, QEvent * event)
使用 QResizeEvent
实例。
关于c++ - 隐藏 QDockWidget 的小部件并同时设置垂直标题栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37832208/