Evgenii Legotckoi
Evgenii Legotckoi24. Oktober 2015 13:37

Qt/C++ - Lektion 038. Wechseln zwischen Fenstern im Qt

Neulich wandte sich einer der Leser mit einer Frage an mich, deren Antwort er im Internet suchte. Ich habe nicht viel Freizeit, aber anscheinend sind die Sterne so zusammengelaufen, dass die Zeit war und eine Frage aus der Kategorie derer, in denen ich bereits eine gewisse Erfahrung gemacht habe.

Der springende Punkt war also, den Wechsel zwischen dem Hauptfenster und den Nebenfenstern zu organisieren. Ja, so dass das geöffnete Fenster geschlossen und stattdessen ein zweites Fenster geöffnet wurde. Das heißt, um im Hauptfenster der Anwendung per Knopfdruck ein weiteres Fenster zu öffnen und gleichzeitig das Hauptfenster zu schließen. Gleichzeitig enthält das zweite Fenster eine Schaltfläche, durch die das Hauptfenster geöffnet und das zweite Fenster entsprechend geschlossen wird.

Projektstruktur

Die Struktur des Projekts unterscheidet sich vom Standard durch das Vorhandensein einer zusätzlichen Klasse, die für sekundäre Fenster verantwortlich ist.

  • otherwindow.h - Header-Datei des sekundären Fensters;
  • otherwindow.cpp - Sekundäre Fensterquelldatei.

Aussehen von Fenstern

Solche Fenster werfen wir mit Hilfe des Interface Designers und auf dem Weg zum Programmcode ein.

Wechseln Sie zwischen Fenstern. Hauptfenster

Wechseln Sie zwischen Fenstern. Sekundäres Fenster

main.cpp

Diese Datei, aus der die Anwendung startet, wird standardmäßig erstellt. Wir ändern hier nichts.

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h

In die Header-Datei des Hauptanwendungsfensters müssen Sie die Header-Datei des sekundären Anwendungsfensters aufnehmen.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <anotherwindow.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    // Слоты от кнопок главного окна
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
    // второе и третье окна
    AnotherWindow *sWindow;
    AnotherWindow *thirdWindow;
};

#endif // MAINWINDOW_H

mainwindow.cpp

Die Initialisierung der beiden Nebenfenster erfolgt im Hauptfenster und über das System der Signale und Slots werden diese Fenster durch Signale der Schaltflächen im Hauptfenster angezeigt. Dadurch wird das Hauptfenster geschlossen.

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // Инициализируем второе окно
    sWindow = new AnotherWindow();
    // подключаем к слоту запуска главного окна по кнопке во втором окне
    connect(sWindow, &AnotherWindow::firstWindow, this, &MainWindow::show);

    // Инициализируем третье окно
    thirdWindow = new AnotherWindow();
    // подключаем к слоту запуска главного окна по кнопке в третьем окне
    connect(thirdWindow, &AnotherWindow::firstWindow, this, &MainWindow::show);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    sWindow->show();  // Показываем второе окно
    this->close();    // Закрываем основное окно
}

void MainWindow::on_pushButton_2_clicked()
{
    thirdWindow->show();  // Показываем третье окно
    this->close();    // Закрываем основное окно
}

otherwindow.h

#ifndef ANOTHERWINDOW_H
#define ANOTHERWINDOW_H

#include <QWidget>

namespace Ui {
class AnotherWindow;
}

class AnotherWindow : public QWidget
{
    Q_OBJECT

public:
    explicit AnotherWindow(QWidget *parent = 0);
    ~AnotherWindow();

signals:
    void firstWindow();  // Сигнал для первого окна на открытие

private slots:
    // Слот-обработчик нажатия кнопки
    void on_pushButton_clicked();

private:
    Ui::AnotherWindow *ui;
};

#endif // ANOTHERWINDOW_H

otherwindow.cpp

Auf ähnliche Weise erstellen wir einen Button-Handler im sekundären Fenster. Der Unterschied besteht darin, dass das Hauptfenster bereits existiert, also müssen wir ein Signal an das Hauptfenster senden, damit es geöffnet wird.

#include "anotherwindow.h"
#include "ui_anotherwindow.h"

AnotherWindow::AnotherWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::AnotherWindow)
{
    ui->setupUi(this);
}

AnotherWindow::~AnotherWindow()
{
    delete ui;
}

void AnotherWindow::on_pushButton_clicked()
{
    this->close();      // Закрываем окно
    emit firstWindow(); // И вызываем сигнал на открытие главного окна
}

Endeffekt. Zwischen Fenstern wechseln

Durch solche Manipulationen können Sie zwischen Anwendungsfenstern wechseln und haben gleichzeitig immer nur ein Anwendungsfenster geöffnet. Eine Demonstration der Anwendung können Sie im Video-Tutorial sehen.

Videoanleitung

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

m
  • 18. März 2018 13:42

Добрый вечер.
Делал все по вашу примеру, только почему-то не выходит. Выдает ошибку:"Error: dependent '..\untitled\form.ui' does not exist.". Не могли бы вы подсказать в чем причина?

Evgenii Legotckoi
  • 18. März 2018 13:46

Добрый вечер!

Создали форму, удалили форму, не перезапустили qmake, поэтому скорее всего и не находит ту форму в проекте.
m
  • 18. März 2018 14:49

Благодарю за столь быстрый ответ. Вы были правы, но теперь, когда я все пересоздал, появляется совсем иная проблема: :шибка: C2664: 'void Ui_AnotherWindow::setupUi(QDialog *)' : cannot convert argument 1 from 'AnotherWindow *const ' to 'QDialog *'

Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Evgenii Legotckoi
  • 19. März 2018 05:14

У вас AnotherWindow скорее всего наследован от QWidget, как в статье, а форму создали в качестве диалога, поэтому и наследована он от QDialog, поэтому и выдаёт ошибки. О чём и говорит Вам компилятор.

ДК
  • 6. Januar 2019 10:12
  • (bearbeitet)

Вот такая вот ошибка возникла когда пытался реализовать код. Понимаю что ошибка связана с указателем но не могу её исправить. Ошибка вылетает сразу после инициализации в MainWindow (sec = new second();) Можете, пожалуйста, помочь

LNK2019: ссылка на неразрешенный внешний символ "public: __cdecl second::second(class QWidget )" (??0second@@QEAA@PEAVQWidget@@@Z) в функции "public: __cdecl MainWindow::MainWindow(class QWidget )" (??0MainWindow@@QEAA@PEAVQWidget@@@Z)

Evgenii Legotckoi
  • 6. Januar 2019 10:19

вот если это находится в коде, то это точно не правильно

MainWindow (sec = new second();)

Во-первых точка с запятой там не к месту, во вторых значение по умолчанию не очень хорошее, лучше в конструкторе это было реализовать.

Нужно смотреть более подробно код. Создайте тему на форуме и выложите более подробно листинг кода.

Ссылка на форум

sec = new second();

Вот что находится в коде, только в замешательство вас ввел...
Делал как написано выше, даже пробовал тупо скопировать код, но всеравно выбивает проблему с указателем. Может быть что нужно было подключить в файлике .про?

НК
  • 5. Februar 2019 13:49
  • (bearbeitet)

Здравствуйте! Скажите, пожалуйста, на проблему:

"Дима Коноплянка#6 января 2019 г. 15:12(ред.)

Вот такая вот ошибка возникла когда пытался реализовать код. Понимаю что ошибка связана с указателем но не могу её исправить. Ошибка вылетает сразу после инициализации в MainWindow (sec = new second();) Можете, пожалуйста, помочь

LNK2019: ссылка на неразрешенный внешний символ "public: cdecl second::second(class QWidget )" (??0second@@QEAA@PEAVQWidget@@@Z) в функции "public: cdecl MainWindow::MainWindow(class QWidget )" (??0MainWindow@@QEAA@PEAVQWidget@@@Z) "

Вы ответили где-нибудь?

Добрый день!

Вот обсуждение на форуме. Там нужно было пересобрать проект.

Спасибо

АИ
  • 9. Februar 2019 08:51
  • (bearbeitet)

здраствуйте

а если я хочу создать три окна.
к примеру иконка при нажатие на нее срабатывает второе окно (предположим авторизация), при нажатие на кнопку авторизация срабатывает третие.
создал по вашему образцу, но при создание 3-его файла пишет либо ошибка : надо добавить сигнал в заголовочный файл(при нажатие на авторизация), либо если все же добавить сигнал то после второго все закрывается и третие окно не появляется.
можно же все таки это как-то реализовать?

Добрый день.

Конечно, можно - это же C++.

Ну вам скорее всего просто нужно правильно сигналы и слоты друг к другу подключить, возможно, нудно ещё пару сигналов написать. Всё делается по аналогии.

n
  • 1. Juni 2019 14:14

Здраствуйте!А если я пишу приложение для тестирования знаний, мне нужно создавать каждый раз новое диалоговое окно или на одном окне выводить информацию? При этом мне надо ответы сохранять в базу данных. Тест из одного варианта.

Evgenii Legotckoi
  • 4. Juni 2019 06:01

Добрый день! Вообще на ваше усмотрение, хотите открывайте новое окно, хотите делайте всё в одном окне. Но я бы сделал в одном окне, если это касается просто списка вопросов. То есть можно просто заменять информацию или использовать QStackedWidget, чтобы накидать для каждого вопроса самостоятельную форму, но при этом разместить всё в одном окне.

Для работы с базой данных есть вот эта статья. . А также ещё ряд статей в разделе по Qt

Здравствуйте!
Полностью скопировал ваш пример к себе, чтобы разобраться. А он не хочет запускаться, дает ошибку:
invalid use of incomplete type ‘class Ui::AnotherWindow’
ui(new Ui::AnotherWindow)
^~~~~~~~~~~~~
Подскажите пожалуйста в чем может быть проблема?

Добрый день. У вас ui файлов по ходу нет. UI файлы используются для вёрстки в графическом дизайнере.

Ну, не настолько со мной всё полхо...))) Вроде бы. Я ж кнопки отрисовываю.

Evgenii Legotckoi
  • 9. Dezember 2019 03:41
  • (bearbeitet)

Эта ошибка invalid use of incomplete type ‘class Ui::AnotherWindow’ обычно говорит о том, что не найдено определение класса или структуры. Типичная проблема - не подключён заголовочный файл, или этот файл не найден. Заголовочные файлы ui генерируются автоматически из *.ui файлов. Если файл не был найден, то причины могут быть следующие:

  • не был написан include
  • не был создан ui файл
  • возможно, требуется перезапустить qmake

Я не знаю насколько с вами всё плохо, я не видел вас и вашего проекта )))) я лишь делаю выводы на основе предоставленной вами информации и моего личного опыта ;-)

v
  • 10. März 2020 08:46

Здравстуйте. У меня возникла ошибка: cannot initialize a parameter of type 'QMainWindow ' with an rvalue of type 'AnotherWindow '. Данная ошибка находится в файле "anotherwindow.cpp" в строке "ui->setupUi(this);" Можете подсказать с чем это может быть связано и как решить эту проблему?

Evgenii Legotckoi
  • 10. März 2020 08:55

Добрый день,
Скорее всего какая-то проблема с классом ui файла, AnotherWindow я наследовал от QWidget, а вы скорее всего создали как QMainWindow этот класс.

v
  • 10. März 2020 09:31

Благодарю, создал заново с классом QWidget и все заработало

v
  • 10. März 2020 17:44

По аналогии вашего кода я создал 3 окна: "Главное окно", "Второе" и "Третье". С главного окна я спокойно могу переходить на 2 и 3 окна, и с них обратно на главное. Но вот возникает вопрос, а как сделать так чтобы я со 2 окна мог перейти на 3? Пытался сам как-то сделать, но не вышло.

Evgenii Legotckoi
  • 11. März 2020 04:22
  • (bearbeitet)

ну ёлы-палы, там кода-то раз-два и обчёлся, давайте-ка приложите больше усилий.

В
  • 3. Juli 2020 00:26

Добрый день!
При описании конструктора AnotherWindow возникает ошибка "allocation of incomplete type 'Ui::AnotherWindow'"
Объясните пожалуйста, что не так

Evgenii Legotckoi
  • 3. Juli 2020 01:15

Если у вас нет ui файла этого окна, то его нужно добавить. Если о добавлен, то нужно просто попробовать запустить сборку. Это автогенерируемая часть кода, и если сборка не была запущена, то Qt Creator показывает ошибку статическим анализатором.

А
  • 6. Oktober 2021 09:47

Здравствуйте, при создании сигнала для первого окна, пишет "void is protected"

A
  • 12. Januar 2022 11:41

Здравствуйте, а как сделать чтобы второе и третье окно не сохраняли свои параметры а создавались заного? Только начинаю изучать прогграмирование и пишу протенькую игру сделал 2 окна, одно с меню другое с самой игрой, проблема в том что когда 2 раз запускаешь игру она уже закончена, а мне надо чтобы игра началась заного.

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken