gpt4 book ai didi

c++ - 应用程序启动时停靠 QDockWidget?

转载 作者:行者123 更新时间:2023-11-30 03:29:16 26 4
gpt4 key购买 nike

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

为了让您了解此类的布局,这里是它的标题。假设我想保留 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,所以我不能只需在主 .cpp 文件中执行 addDockWidget

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

最佳答案

假设第二段代码:

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

位于继承自 QMainWindow 的类的构造函数中(否则您将没有 addDockWidget 等功能),如果您执行此代码,您可能会遇到奇怪的行为,因为您添加的是相同的小部件 (LoggerWidget) 到窗口的中央部分以及可停靠区域(如果有效,您将在两者中看到完全相同的内容)。请在附带的代码中找到一个 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);
}

主窗口小部件标题

#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

主窗口小部件 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());
}

关于c++ - 应用程序启动时停靠 QDockWidget?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45806767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com