c++ - 隐藏 QDockWidget 的小部件并同时设置垂直标题栏

标签 c++ qt qdockwidget

我在 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/

相关文章:

c++ - Ctypes "symbol not found"用于 OSX 中的动态库

c++ - cudaMallocPitch 和 cudaMemcpy2D

c++ - OpenCV cvSet2d .....这是做什么的

c++ - 在 Windows 7 上编译源 Qt 4.7.4 错误 qmake 不是内部或外部命令

c++ - 在库之间传递对象和调用成员函数是如何工作的?

c++ - 在 std::list 和 std::vector 之间进行选择

python - QMetaObject::invokeMethod 找不到该方法

c++ - 调整 QMainwindow 大小以适合 Qdockwidget 大小

c++ - 防止 QDockWidget 自动调整大小行为