1

こんにちは私は隠しとしてそれを開始しているドックウィジェットを作成します。問題は、後でisHidden()関数からステータスを正しく取得できるのに、それを表示できないことです。奇妙なことに、隠されていないドックウィジェットを起動すると、完璧に動作します。この奇妙な振る舞いを再現する例を含めています。

mainwindow.h

#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

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

上記のコードであるため、dockwidgetは画面に表示されません。mainwindow.cppで指定している行にコメントを付けようとすると機能しますが、要点は、ドックウィジェットを非表示にして開始したいということです。誰かが何が起こっているのか、何か考えを持っていますか?

ありがとう。

4

2 に答える 2

0

QDockコントロールの親は、クラスwindowのオブジェクトではなく、ウィジェットにする必要があります。MainWindow

したがって、これを置き換える必要があります。

 dock = new QDockWidget(this);

これとともに:

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

最初のケースでも、Show ボタンを押すとコントロールが表示されますが、ウィンドウの外にあるため、表示されない場合があります。QMainWindowまた、すでに継承している内部クラスの別のインスタンスを作成する必要はありませんQMainWindow

于 2013-02-06T00:31:40.417 に答える