【发布时间】:2016-06-15 10:02:27
【问题描述】:
我在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);
NB : 如果我改变 pDock->widget()->hide() in pDock->widget()->show() 反之亦然,我几乎有想要的行为,但小部件在标题栏是水平的(我希望标题栏垂直时隐藏它)...
我也放了resizeEvent()。当我触发按钮时,标题栏水平,我有:
我是垂直的
我是水平的
我是水平的
如果我再次触发按钮:
我是垂直的
我是水平的
我是水平的
我是水平的
谁能解释我这种行为和/或告诉我我做错了什么以及如何解决它?
编辑:我在 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);
}
然后:
- 第一次触发:标题栏设置为垂直(没关系)但小部件仍然显示
- 第二次触发:标题栏回到水平但这次隐藏的小部件
- 第三次触发,之后是:标题栏垂直显示小部件,然后标题栏水平显示小部件。我想要相反的,即标题栏垂直/小部件隐藏和标题栏水平/小部件显示。
【问题讨论】:
标签: c++ qt qdockwidget