我有一个类构建了一个可以停靠在我的主应用程序中的小部件。该类继承QDockWidget
。如果我愿意的话,这允许我停靠小部件。但是,我希望此窗口小部件默认停靠,而不是显示为单独的浮动窗口。
为了让您了解此类的布局,这里是它的标题。请考虑我要保留log
和showMessage
函数。
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文件中。
如何在保持班级提供的功能的同时完成这项工作?
答案 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