应用程序启动时停靠 QDockWidget?
Docking a QDockWidget when application starts?
我有一个 class 构建了一个小部件,我可以将其停靠到我的主应用程序中。这个class继承了QDockWidget
。如果愿意,这允许我停靠小部件。但是,我希望这个小部件默认停靠而不是显示为单独的浮动 window.
为了让您了解 class 的布局方式,这里是它的 header。考虑到我想保留 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 小部件。然后我可以将它停靠在主 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());
}
我有一个 class 构建了一个小部件,我可以将其停靠到我的主应用程序中。这个class继承了QDockWidget
。如果愿意,这允许我停靠小部件。但是,我希望这个小部件默认停靠而不是显示为单独的浮动 window.
为了让您了解 class 的布局方式,这里是它的 header。考虑到我想保留 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 小部件。然后我可以将它停靠在主 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());
}