2017-08-21 4 views
0

J'ai une classe qui construit un widget que je suis capable d'ancrer dans mon application principale. Cette classe hérite de QDockWidget. Cela me permet d'ancrer le widget si je le souhaite. Cependant, je voudrais que ce widget soit ancré par défaut au lieu de s'afficher comme une fenêtre flottante séparée.Ancrer un QDockWidget au démarrage de l'application?

Pour vous donner une idée de la façon dont cette classe est présentée, voici l'en-tête correspondant. Considérez que je veux garder les fonctions log et 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 

Dans le fichier .cpp pour mon application principale, j'utilise loggerWidget = new Logger(this);. Cela fonctionne, et quand j'ouvre mon application, le widget Logger apparaît. Je peux ensuite l'ancrer dans les côtés de la fenêtre principale de n'importe quel côté.

Le problème que je rencontre est d'amener ce widget à être ancré sur le côté droit de la fenêtre principale lors de l'ouverture.

J'ai cherché une solution et trouvé que quelque chose de similaire à ce qui suit devrait fonctionner dans le fichier .cpp de la fenêtre principale. Je ne sais pas comment l'appliquer correctement.

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

Je pense que la question est que, puisque ma Logger classe hérite QDockWidget mais pas vraiment un QDockWidget, donc je ne peux pas faire juste un addDockWidget dans le fichier .cpp principal.

Comment est-ce que je peux faire fonctionner ceci tout en gardant la fonctionnalité que la classe fournit?

+0

Il montre la mise en œuvre complète de votre classe, au moins le constructeur. – eyllanesc

Répondre

1

En supposant que le second pice de code:

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

est dans le constructeur d'une classe qui hérite de QMainWindow (sinon vous ne serez pas avoir des fonctionnalités telles que addDockWidget), vous pouvez vous attendre un comportement bizarre si vous exécutez ce code car vous ajoutez le même widget (LoggerWidget) à la partie centrale de la fenêtre ainsi qu'à la zone ancrable (si cela fonctionne, vous verrez exactement la même chose dans les deux). S'il vous plaît trouver dans le code ci-joint un exemple simple d'un QMainWindow avec un widget central et un widget accosté qui hérite de QDockWidget:

tête de l'enregistreur

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

En-tête de la fenêtre principale

#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 

widget fenêtre principale 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()); 
}