应用程序启动时停靠 QDockWidget?

Docking a QDockWidget when application starts?

我有一个 class 构建了一个小部件,我可以将其停靠到我的主应用程序中。这个class继承了QDockWidget。如果愿意,这允许我停靠小部件。但是,我希望这个小部件默认停靠而不是显示为单独的浮动 window.

为了让您了解 class 的布局方式,这里是它的 header。考虑到我想保留 logshowMessage 函数。

Logger.h

class Logger : public QDockWidget
{
  Q_OBJECT

public:
  explicit Logger(QWidget* parent = 0);
  void log(QString message);

  ~Logger();

private:
  QWidget* dockWidgetContents;
  QGridLayout* gridLayout;
  QTextEdit* LoggerEdit;
  void showMessage(QString &message);
};

#endif // MESSAGES_H

在我的主应用程序的 .cpp 文件中,我使用 loggerWidget = new Logger(this);。这有效,当我打开我的应用程序时,会弹出 Logger 小部件。然后我可以将它停靠在主 window 的任何一侧。

我 运行 遇到的问题是让这个小部件在打开时停靠在主要 window 的右侧。

我四处寻找解决方案,发现类似于以下内容的内容应该可以在主 window.cpp 文件中使用。我只是不知道如何正确地实现它。

LoggerWidget = new Logger(this);
this->setWidget(LoggerWidget);
addDockWidget(Qt::RightDockWidgetArea, LoggerWidget);
LoggerWidget->setFloating(false);

我认为问题是因为我的 Logger class 继承了 QDockWidget 但实际上不是 QDockWidget,所以我不能只做一个addDockWidget 在主 .cpp 文件中。

如何在保持 class 提供的功能的同时完成这项工作?

假设第二张代码:

LoggerWidget = new Logger(this);
this->setWidget(LoggerWidget);
addDockWidget(Qt::RightDockWidgetArea, LoggerWidget);
LoggerWidget->setFloating(false);

位于继承自 QMainWindow 的 class 的构造函数中(否则您将没有 addDockWidget 等功能),如果您执行此代码,您可能会遇到奇怪的行为,因为您是将相同的小部件 (LoggerWidget) 添加到 window 的中央部分以及可停靠区域(如果有效,您将在两者中看到完全相同的东西)。请在附带的代码中找到一个简单的 QMainWindow 示例,其中包含一个中央小部件和一个继承自 QDockWidget 的停靠小部件:

记录器header

#ifndef LOGGER_H
#define LOGGER_H

#include <QDockWidget>
#include <QTextEdit>


class Logger : public QDockWidget
{
  Q_OBJECT

public:
  explicit Logger(QTextEdit* source, QWidget* parent = 0);
    ~Logger();

public slots:
  void log(QString message);

private:
  QTextEdit* LoggerEdit;
  QTextEdit* texteditSource;
  void showMessage(QString message);
};

#endif // LOGGER_H

记录器 cpp

#include "logger.h"

Logger::Logger(QTextEdit* source, QWidget* parent):
    QDockWidget(parent),texteditSource(source)
{
    QDockWidget::setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    LoggerEdit = new QTextEdit();
    LoggerEdit->setReadOnly(true);
    QDockWidget::setWidget(LoggerEdit);
}

Logger::~Logger()
{
    delete LoggerEdit;
}


void Logger::log(QString message)
{
    showMessage(message);
}

void Logger::showMessage(QString message)
{
    LoggerEdit->setText(message);
}

主要 window 小部件 header

#ifndef CUSTOMMAINWINDOW_H
#define CUSTOMMAINWINDOW_H

#include <QMainWindow>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QTextEdit>
#include "logger.h"

class MainWindow: public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget* parent = 0);

private slots:
    void buttonClicked();

private:
    QTextEdit* textEdit;
    Logger* logger;
    QPushButton* button;
};

#endif // CUSTOMMAINWINDOW_H

主要 window 小部件 cpp

#include "custommainwindow.h"

MainWindow::MainWindow(QWidget* parent):
    QMainWindow(parent)
{
    // Set window title
    QMainWindow::setWindowTitle("Simple Example");

    // Create central text
    textEdit = new QTextEdit;// text edit to get text for the docked widget

    // Create update button
    button = new QPushButton("Update dockable widget");

    // Create Logger inherited from QDockWidget
    logger = new Logger(textEdit);
    QMainWindow::addDockWidget(Qt::RightDockWidgetArea,logger);

    // Set central widget
    QMainWindow::setCentralWidget(new QWidget);
    QMainWindow::centralWidget()->setLayout(new QVBoxLayout);
    QMainWindow::centralWidget()->layout()->addWidget(textEdit);
    QMainWindow::centralWidget()->layout()->addWidget(button);

    // Connect for update docked wiget
    QObject::connect(button,SIGNAL(clicked()),this,SLOT(buttonClicked()));
}

void MainWindow::buttonClicked()
{
    logger->log(textEdit->toPlainText());
}