Viele Anwendungen wie Photoshop können Projekte (Bilder, Texte usw.) in Fenstern öffnen, die sich im Hauptanwendungsfenster öffnen. Qt bietet eine ähnliche Funktionalität in Form der QMdiArea-Klasse. In einem Objekt dieser Klasse können Sie Objekte von Klassen platzieren, die von der QWidget -Klasse geerbt wurden, und dementsprechend die QWidget-Klasse. Diese Objekte werden als Fenster angezeigt, nur sie befinden sich innerhalb von QMdiArea.
Schauen wir uns ein Beispiel mit einem Fenster in einem Fenster an.
Projektstruktur
Das Projekt enthält die folgenden Dateien:
- MdiWindow.pro - Projektprofil, standardmäßig erstellt;
- main.cpp - Programmstartdatei mit Hauptfunktion, standardmäßig erstellt;
- mainwindow.h - Header-Datei des Hauptanwendungsfensters;
- mainwindow.cpp - Quellcodedatei für das Hauptanwendungsfenster;
- mainwindow.ui - Form des Hauptanwendungsfensters;
- icons.qrc - Ressourcendatei, enthält ein Symbol.
Die Dateien MdiWindow.pro und main.cpp werden nicht berücksichtigt, da sie standardmäßig erstellt werden. Die Datei icons.qrc enthält ein Symbol, das in der Symbolleiste des Hauptanwendungsfensters sichtbar ist. Diese Schaltfläche ist für die Erstellung eines zusätzlichen Anwendungsfensters verantwortlich und wird vom Grafikdesigner hinzugefügt. Diese Aktion wird nur benötigt, um ein Signal zum Hinzufügen neuer Fenster zu QMdiArea. zu senden.
Kommen wir nun zum Wesen des Projekts.
Hauptfenster.h
Die Header-Datei des Hauptanwendungsfensters. Enthält eine Deklaration eines Zeigers auf ein QMdiArea -Objekt sowie eine Deklaration eines Slots zum Hinzufügen neuer Fenster, der vom Grafikdesigner erstellt wurde.
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QMdiArea> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_actionAddWindow_triggered(); private: Ui::MainWindow *ui; QMdiArea * mdiArea; // Область, в которую будут добавляться окна }; #endif // MAINWINDOW_H
Hauptfenster.cpp
Das QMdiArea-Objekt wird als zentrales Widget des Hauptfensters der Anwendung festgelegt. Wir richten auch Bildlaufleisten ein, sodass sie nur bei Bedarf angezeigt werden. Fügen Sie im Steckplatz zum Hinzufügen von Fenstern ein QWidget-Objekt mit einer Inschrift hinzu. Hier gibt es einen Punkt. Wenn das QWidget keinen Inhalt enthält, wird es in seiner Mindestgröße geöffnet, selbst wenn Sie seine Größe festlegen. Und nur wenn Sie versuchen, das Fenster zu verschieben, nimmt dieses Widget die eingestellte Größe an.
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QGridLayout> #include <QLabel> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); mdiArea = new QMdiArea(this); // инициализируем QMdiArea // Настраиваем скроллбары mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); // Устанавливаем Mdi Area в качестве центрального виджета setCentralWidget(mdiArea); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_actionAddWindow_triggered() { // Создаём виджет, который будет окном QWidget *widget = new QWidget(mdiArea); // Добавляем в него размещение QGridLayout *gridLayout = new QGridLayout(widget); widget->setLayout(gridLayout); // Добавляем на виджет надпись QLabel *label = new QLabel("Hello, I am sub window!!!", widget); gridLayout->addWidget(label); // Добавляем виджет в качестве подокна в Mdi Area mdiArea->addSubWindow(widget); // Устанавливаем заголовок окна widget->setWindowTitle("Sub Window"); // и показываем виджет widget->show(); }