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.
Добрый вечер.
Делал все по вашу примеру, только почему-то не выходит. Выдает ошибку:"Error: dependent '..\untitled\form.ui' does not exist.". Не могли бы вы подсказать в чем причина?
Добрый вечер!
Благодарю за столь быстрый ответ. Вы были правы, но теперь, когда я все пересоздал, появляется совсем иная проблема: :шибка: C2664: 'void Ui_AnotherWindow::setupUi(QDialog *)' : cannot convert argument 1 from 'AnotherWindow *const ' to 'QDialog *'
У вас AnotherWindow скорее всего наследован от QWidget, как в статье, а форму создали в качестве диалога, поэтому и наследована он от QDialog, поэтому и выдаёт ошибки. О чём и говорит Вам компилятор.
Вот такая вот ошибка возникла когда пытался реализовать код. Понимаю что ошибка связана с указателем но не могу её исправить. Ошибка вылетает сразу после инициализации в 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)
вот если это находится в коде, то это точно не правильно
Во-первых точка с запятой там не к месту, во вторых значение по умолчанию не очень хорошее, лучше в конструкторе это было реализовать.
Нужно смотреть более подробно код. Создайте тему на форуме и выложите более подробно листинг кода.
Ссылка на форум
Вот что находится в коде, только в замешательство вас ввел...
Делал как написано выше, даже пробовал тупо скопировать код, но всеравно выбивает проблему с указателем. Может быть что нужно было подключить в файлике .про?
Здравствуйте! Скажите, пожалуйста, на проблему:
Вот такая вот ошибка возникла когда пытался реализовать код. Понимаю что ошибка связана с указателем но не могу её исправить. Ошибка вылетает сразу после инициализации в 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) "
Вы ответили где-нибудь?
Добрый день!
Вот обсуждение на форуме. Там нужно было пересобрать проект.
Спасибо
здраствуйте
а если я хочу создать три окна.
к примеру иконка при нажатие на нее срабатывает второе окно (предположим авторизация), при нажатие на кнопку авторизация срабатывает третие.
создал по вашему образцу, но при создание 3-его файла пишет либо ошибка : надо добавить сигнал в заголовочный файл(при нажатие на авторизация), либо если все же добавить сигнал то после второго все закрывается и третие окно не появляется.
можно же все таки это как-то реализовать?
Добрый день.
Конечно, можно - это же C++.
Ну вам скорее всего просто нужно правильно сигналы и слоты друг к другу подключить, возможно, нудно ещё пару сигналов написать. Всё делается по аналогии.
Здраствуйте!А если я пишу приложение для тестирования знаний, мне нужно создавать каждый раз новое диалоговое окно или на одном окне выводить информацию? При этом мне надо ответы сохранять в базу данных. Тест из одного варианта.
Добрый день! Вообще на ваше усмотрение, хотите открывайте новое окно, хотите делайте всё в одном окне. Но я бы сделал в одном окне, если это касается просто списка вопросов. То есть можно просто заменять информацию или использовать QStackedWidget, чтобы накидать для каждого вопроса самостоятельную форму, но при этом разместить всё в одном окне.
Для работы с базой данных есть вот эта статья. . А также ещё ряд статей в разделе по Qt
Здравствуйте!
Полностью скопировал ваш пример к себе, чтобы разобраться. А он не хочет запускаться, дает ошибку:
invalid use of incomplete type ‘class Ui::AnotherWindow’
ui(new Ui::AnotherWindow)
^~~~~~~~~~~~~
Подскажите пожалуйста в чем может быть проблема?
Добрый день. У вас ui файлов по ходу нет. UI файлы используются для вёрстки в графическом дизайнере.
Ну, не настолько со мной всё полхо...))) Вроде бы. Я ж кнопки отрисовываю.
Эта ошибка invalid use of incomplete type ‘class Ui::AnotherWindow’ обычно говорит о том, что не найдено определение класса или структуры. Типичная проблема - не подключён заголовочный файл, или этот файл не найден. Заголовочные файлы ui генерируются автоматически из *.ui файлов. Если файл не был найден, то причины могут быть следующие:
Я не знаю насколько с вами всё плохо, я не видел вас и вашего проекта )))) я лишь делаю выводы на основе предоставленной вами информации и моего личного опыта ;-)
Здравстуйте. У меня возникла ошибка: cannot initialize a parameter of type 'QMainWindow ' with an rvalue of type 'AnotherWindow '. Данная ошибка находится в файле "anotherwindow.cpp" в строке "ui->setupUi(this);" Можете подсказать с чем это может быть связано и как решить эту проблему?
Добрый день,
Скорее всего какая-то проблема с классом ui файла, AnotherWindow я наследовал от QWidget, а вы скорее всего создали как QMainWindow этот класс.
Благодарю, создал заново с классом QWidget и все заработало
По аналогии вашего кода я создал 3 окна: "Главное окно", "Второе" и "Третье". С главного окна я спокойно могу переходить на 2 и 3 окна, и с них обратно на главное. Но вот возникает вопрос, а как сделать так чтобы я со 2 окна мог перейти на 3? Пытался сам как-то сделать, но не вышло.
ну ёлы-палы, там кода-то раз-два и обчёлся, давайте-ка приложите больше усилий.
Добрый день!
При описании конструктора AnotherWindow возникает ошибка "allocation of incomplete type 'Ui::AnotherWindow'"
Объясните пожалуйста, что не так
Если у вас нет ui файла этого окна, то его нужно добавить. Если о добавлен, то нужно просто попробовать запустить сборку. Это автогенерируемая часть кода, и если сборка не была запущена, то Qt Creator показывает ошибку статическим анализатором.
Здравствуйте, при создании сигнала для первого окна, пишет "void is protected"
Здравствуйте, а как сделать чтобы второе и третье окно не сохраняли свои параметры а создавались заного? Только начинаю изучать прогграмирование и пишу протенькую игру сделал 2 окна, одно с меню другое с самой игрой, проблема в том что когда 2 раз запускаешь игру она уже закончена, а мне надо чтобы игра началась заного.