2013-02-05 1 views
1

안녕하세요, 저는 숨겨진 것으로 시작하는 dockwidget을 만듭니다. 문제는 이후 isHidden() 함수에서 상태를 올바르게 얻을 수 있지만 표시 할 수 없다는 것입니다. 기이 한 일은 내가 숨겨진 dockwidget을 시작하면 완벽하게 작동한다는 것입니다. 이 이상한 행동을 재현하는 예제를 포함하고 있습니다.qt에 숨겨진 dockwidget 표시

mainwindow.h는 이제 dockwidget 화면에 나타나지 않는 경우, 상기 코드

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

// QMainWindow mainWindow; 
// QDockWidget *dock = new QDockWidget(&mainWindow); 
    QDialog *dockDialog = new QDialog(this); // <---------edit: you need to create a parent widget for the dock 
    dock = new QDockWidget(dockDialog); 

    dock->setStyleSheet("QDockWidget { font: bold }"); 
    dock->setFloating(true); 
    dock->setFeatures(QDockWidget::DockWidgetVerticalTitleBar | QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); 
    QAbstractButton *floatButton = dock->findChild<QAbstractButton*>("qt_dockwidget_floatbutton"); 
    if(floatButton) 
     floatButton->hide(); 

    dock->setAllowedAreas(Qt::NoDockWidgetArea); 
    dock->setWindowTitle("Tools"); 

    this->addDockWidget(Qt::TopDockWidgetArea, dock, Qt::Vertical); 

    QMainWindow *window = new QMainWindow(dock); // <------edit: set the dock to be the parent for the window 
    window->setWindowFlags(Qt::Widget); 
    QToolBar *bar = new QToolBar(window); 

    bar->setMovable(false); 
    bar->addAction("Select"); 
    bar->addAction("Polygon"); 
    bar->addAction("Brush"); 
    bar->addAction("Erazer"); 
    bar->addSeparator(); 
    bar->addAction("Mark"); 
    bar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 
    bar->setOrientation(Qt::Vertical); 

    window->addToolBar(Qt::LeftToolBarArea, bar); 
    window->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 

    window->setParent(dock); 
    dock->setWidget(window); 
    dock->hide();   // <------------ comment this line and it will work, edit: you do not need to do that anymore, it is working nicely now 

    button = new QPushButton("show", this); 
    button->setCheckable(true); 

    QObject::connect(button, SIGNAL(clicked()), this, SLOT(showDock())); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 


void MainWindow::showDock() 
{ 
// qDebug() << "hello"; 
    if(button->isChecked()){ 
     if(dock->isHidden()){ 
      qDebug() << "hidden"; 
     dock->setFloating(true); // <-----edit: you need to add these lines in order to be able to see the dialog that contains the dock widget, i do not know why i need to that again since in the initialization i already specifying that my dock is floatable 
     QAbstractButton *floatButton = dock->findChild<QAbstractButton*>("qt_dockwidget_floatbutton"); // <---------edit: add this lines in order to get rid off the floating button 
     if(floatButton) 
      floatButton->hide(); // <----edit: the same as previous 
     dock->show(); 
     } 
    } 

    if(!button->isChecked()){ 
     if(!dock->isHidden()){ 
      qDebug() << "not hidden"; 
      dock->hide(); 
     } 
    } 
} 

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QtGui> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
private slots: 

    void showDock(); 
private: 
    Ui::MainWindow *ui; 

    QDockWidget *dock; 
    QPushButton *button; 


}; 

#endif // MAINWINDOW_H 

mainwindow.cpp. 내가 mainwindow.cpp에서 지정하는 라인을 주석하려고하면, 작동하지만 점은 숨겨진 dockwidget을 시작하고 싶다는 것입니다. 누군가 일어나고있는 일에 대해 어떤 생각을 가지고 있습니까?

감사합니다.

+0

@ Nemanja의 제안은 정확하게 원했던 것처럼 작동하지 않았지만 내가 원하는대로 작동하도록하기 위해 몇 가지 힌트를주었습니다. 이미 수정 사항을 추가했습니다. 나는 그것이 올바른 방법인지, 나는 그것을하고 있지만, 지금은 제대로 작동하는지 모른다. 감사 – ThT

답변

0

부모의 QDock 컨트롤은 window 위젯이어야하며 MainWindow 클래스의 객체가 아니어야합니다. 당신도 첫 번째 경우에 표시 버튼을 누를 때

QMainWindow *window = new QMainWindow(0); // I smell a potential leak here (set the parent!) 
dock = new QDockWidget(window); 

제어가 볼 수 있지만 외부 어딘가에이와

dock = new QDockWidget(this); 

:

그래서, 당신은이를 교체해야 창, 그래서 당신은 그것을 볼 수 없습니다. 또한 QMainWindow을 이미 상속 한 클래스에 QMainWindow이라는 별도의 인스턴스를 만들 필요가 없습니다.

0

dockwidget을()/hide() 참조하십시오. 직접 시도하지는 않았지만 QDockWidget::toggleViewAction 메서드로 dockwdiget을 숨기고 표시해야합니다.