应用程序启动时停靠QDockWidget?

时间:2017-08-21 23:17:49

标签: c++ qt qdockwidget

我有一个类构建了一个可以停靠在我的主应用程序中的小部件。该类继承QDockWidget。如果我愿意的话,这允许我停靠小部件。但是,我希望此窗口小部件默认停靠,而不是显示为单独的浮动窗口。

为了让您了解此类的布局,这里是它的标题。请考虑我要保留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小部件。然后我可以将它停靠在主窗口的任何一侧。

我遇到的问题是在打开时让这个小部件停靠在主窗口的右侧。

我已经四处寻找解决方案,并发现类似于以下内容的内容应该在主窗口.cpp文件中工作。我只是不知道如何正确实现它。

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

我认为问题在于,由于我的Logger课程正在继承QDockWidget,但实际上并非QDockWidget,所以我无法做addDockWidget 1。}在主.cpp文件中。

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

1 个答案:

答案 0 :(得分:1)

假设第二代代码:

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

位于继承自QMainWindow的类的构造函数内(否则您将不具有addDockWidget等功能),如果执行此代码,则可能会出现奇怪的行为,因为您正在添加相同的小部件({ {1}})到窗口的中心部分以及可停靠区域(如果它起作用,你将在两者中看到完全相同的东西)。请在附带的代码中找到一个QMainWindow的简单示例,其中包含一个中央窗口小部件和一个从QDockWidget继承的停靠窗口小部件:

记录器标题

LoggerWidget

记录器cpp

#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

主窗口小部件标题

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

主窗口小部件cpp

#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