2017-08-21 3 views
0

Ich habe eine Klasse, die ein Widget erstellt, das ich an meine Hauptanwendung andocken kann. Diese Klasse erbt QDockWidget. Dies ermöglicht mir, das Widget anzudocken, wenn es mir gefällt. Ich möchte jedoch, dass dieses Widget standardmäßig angedockt wird, anstatt als separates Floating-Fenster angezeigt zu werden.Andocken eines QDockWidget beim Programmstart?

Um Ihnen eine Vorstellung davon zu geben, wie diese Klasse aufgebaut ist, hier ist der Header dafür. Bedenken Sie, dass ich die Funktionen log und beibehalten möchte.

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 

In der CPP-Datei für meine Hauptanwendung, verwende ich loggerWidget = new Logger(this);. Das funktioniert, und wenn ich meine Anwendung öffne, erscheint das Logger-Widget. Ich kann es dann auf jeder Seite an die Seiten des Hauptfensters andocken.

Das Problem, mit dem ich konfrontiert bin, ist, dass dieses Widget beim Öffnen an die rechte Seite des Hauptfensters angedockt wird.

Ich habe nach einer Lösung gesucht und festgestellt, dass etwas Ähnliches wie das Folgende in der Hauptfenster-CPP-Datei funktionieren sollte. Ich weiß einfach nicht, wie ich es richtig umsetzen soll.

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

ich glaube, das Problem ist, dass seit meiner Logger Klasse QDockWidget erben, aber nicht tatsächlich ein QDockWidget, so kann ich nicht nur ein addDockWidget in der Haupt-CPP-Datei tun.

Wie kann ich das schaffen, während ich die Funktionalität der Klasse beibehalte?

+0

Es zeigt die vollständige Umsetzung Ihrer Klasse, zumindest den Konstruktor. – eyllanesc

Antwort

1

Unter der Annahme, dass das zweite Stück des Codes:

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

ist im Konstruktor einer Klasse, die von QMainWindow erbt (sonst werden Sie nicht Funktionalitäten wie addDockWidget), können Sie ein seltsames Verhalten, wenn Sie erwarten, Führen Sie diesen Code aus, weil Sie das gleiche Widget (LoggerWidget) zum zentralen Teil des Fensters sowie zum andockbaren Bereich hinzufügen (wenn es funktioniert, werden Sie in beiden dasselbe sehen). Bitte finden in der beigefügten Code ein einfaches Beispiel eines QMainWindow mit einem zentralen Widget und angedocktem Widget, das von QDockWidget erbt:

Logger Kopf

#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 

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

Hauptfenster Widget 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 

Hauptfenster Widget 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()); 
} 
Verwandte Themen