2016-06-15 5 views
3

Ich habe eine einfache QWidget in einer QDockWidget und meine eigene Titelleiste für dieses Dock-Widget. In diesem Titelleiste, habe ich eine QPushButton die, wenn sie ausgelöst wird, mir erlauben, wird:Verstecke das Widget eines QDockWidget und setze gleichzeitig die vertikale Titelleiste

  • stellen Sie die Titelleiste vertikale
  • das Widget in der QDockWidget

verstecken ich es geschafft, beide zu bekommen von ihnen funktioniert separat, aber ich kann es nicht schaffen gleichzeitig. Hier

ist der Code für die Titelleiste:

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); 
    }   
} 

In meiner Hauptfunktion:

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: Wenn ichpDock->widget()->hide()inpDock->widget()->show()und umgekehrt zu ändern, ich fast das gewünschte Verhalten, aber das Widget ist ausgeblendet, wenn die Titelleiste horizontal ist (ich möchte, dass es ausgeblendet wird, wenn die Titelleiste vertikal ist) ...

Ich habe auch die resizeEvent(). Wenn ich die Taste, die Titelleiste horizontal auslösen, die ich habe:

Ich bin Vertikal

Ich bin Horizontal

Ich bin Horizontal

und wenn ich auslösen, sobald die Taste erneut :

Ich bin vertikal

Ich bin

Horizontal

Ich bin

Horizontal

Ich bin Horizontal

Kann mir jemand erklären dieses Verhalten und/oder mir sagen, was mache ich falsch und wie kann ich es beheben?


Edit: Ich auf Qt5.6 arbeiten, wenn es ankommt.

Ich konzentriere mich nicht auf die resizeEvent() aufgerufen wird oder nicht, es ist nur das Verhalten, das nicht das gewünschte ist.Zur Zeit:

1/Wenn ich diesen Code:

if(features & QDockWidget::DockWidgetVerticalTitleBar) 
    pDock->setFeatures(features^QDockWidget::DockWidgetVerticalTitleBar); 
else 
    pDock->setFeatures(features | QDockWidget::DockWidgetVerticalTitleBar); 

Es funktioniert wie es funktionieren soll: die Titelleiste wird vertikal, wenn die Taste ausgelöst wird, und zurück zur Horizontalen, wenn Ich trigge die Taste erneut an. Außerdem wird das Widget immer angezeigt.

2/Wenn ich diesen Code:

if(features & QDockWidget::DockWidgetVerticalTitleBar) 
{ 
    pDock->widget()->show(); 
    pDock->setFeatures(features^QDockWidget::DockWidgetVerticalTitleBar); 
} 
else 
{ 
    pDock->widget()->hide(); 
    pDock->setFeatures(features | QDockWidget::DockWidgetVerticalTitleBar); 
} 

Dann, wenn ich die Taste auslösen, das Widget versteckt ist (wie gewünscht), aber die Titelleiste nicht vertikal eingestellt. Wenn ich die Schaltfläche erneut trigge, wird das Widget angezeigt (wie gewünscht), und die Titelleiste ist immer noch horizontal (scheint normal, da es bei der ersten Auslösung nicht geändert hat).

3/Wenn ich diesen Code (das ist, wo das Verhalten in der Nähe von zu sein scheint, was ich will):

if(features & QDockWidget::DockWidgetVerticalTitleBar) 
{ 
    pDock->widget()->hide(); 
    pDock->setFeatures(features^QDockWidget::DockWidgetVerticalTitleBar); 
} 
else 
{ 
    pDock->widget()->show(); 
    pDock->setFeatures(features | QDockWidget::DockWidgetVerticalTitleBar); 
} 

Dann:

  • erste Auslösungen: Titel bar set vertikal (es ist in Ordnung) aber Widget immer noch angezeigt
  • zweite Auslösung: Titelleiste zurück zu hori zontal ABER Widget diesmal versteckt
  • dritte Auslösung, und nach: Titelleiste vertikal mit Widget angezeigt, dann Titelleiste horizontal mit Widget versteckt. Ich möchte das Gegenteil, d. H. Titelleiste vertikal/Widget versteckt und Titelleiste horizontal/Widget angezeigt.

Antwort

2

Zuerst habe ich versucht, Ihr Beispiel mit qt4.86 und qt5.5.1 zu kompilieren. Und sie verhalten sich ein bisschen anders. Mit qt4.86 denke ich, es funktioniert gut. Aber mit qt5.5.1 zeigt es wirklich "Ich bin horizontal", wie Sie beschrieben haben. Ich weiß nicht, warum sie sich unterscheiden, aber sie tun es.

Übrigens funktioniert es sowohl auf qt4.86 als auch auf qt5.5.1, wenn ich QDockWidget vom Hauptfenster entferne.

Also ich denke, es funktioniert in der Art, wie Sie nicht erwarten, weil Sie denken, dass, wenn Sie Ihr Widget verstecken, QDockTitleBar::resizeEvent wird sicherlich aufgerufen werden. Aber es ist nicht immer wahr. Wenn zum Beispiel die Breite Ihres versteckenden Widgets nicht sehr groß ist und die Breite Ihres Dockwidgets von der Titelleistenbreite bestimmt wird, wird resizeEvent in Qt5.5.1 nicht aufgerufen. Wenn Sie möchten, dass Ihr QDockTitleBar::resizeEvent immer nach dem Anzeigen/Verbergen Ihres Widgets aufgerufen wird, können Sie explizit QCoreApplication::sendEvent (QObject * receiver, QEvent * event) mit QResizeEvent Instanz aufrufen.

+0

Das Problem ist nicht auf die resizeEvent() aufgerufen wird oder nicht, es ist auf das Verhalten meiner Dock-Widget. Im Moment kann ich das Widget zwar verstecken/anzeigen, aber ich kann die Titelleiste nicht entsprechend einstellen. Ich werde meine Frage bearbeiten, da sie falsch interpretiert zu sein scheint. – IAmInPLS

0

Sie können versuchen, Ihr Widget aus dem QDockWidget zu entfernen und dann neu zuzuweisen, anstatt es auszublenden.

+0

Funktioniert nicht, das Widget ist hier immer – IAmInPLS

+0

Ist Ihr Signal-Slot gut verbunden?auf deinem Code sehe ich, dass du connect geschrieben hast (m_pToggleButton, SIGNAL (clicked()), dies, SLOT (toggleButtonTriggered())); anstelle von connect (m_pToggleButton, SIGNAL (clicked()), dies, SLOT (toggleActionTriggered())); – Daniele

+0

Ja, ja, es ist natürlich gut verbunden, nur ein Tippfehler beim Erstellen einer MVCE – IAmInPLS

Verwandte Themen