Evgenii Legotckoi
Evgenii LegotckoiOct. 24, 2015, 1:37 p.m.

Qt/C++ - Lesson 038. Switching between windows in the Qt

Recently, a subscriber asked me for help on the issue, the answer to which he was looking for on the Internet. I do not have much free time, but it seems the stars have converged so that time was the question from the category of those that have already had some experience.

So, the crux of the matter was that, in order to arrange to switch between the main window and the secondary. Yes thereby to shut the open window and the second window opened instead. That is to say that at the touch of a button in the main window to open another window and close the main window at the same time. In this second box contains a button, clicking on which opens the main window and the second window is closed, respectively.

Project structure

The project structure is characterized by the presence of an additional class of default, which would be responsible for the secondary window.

  • anotherwindow.h - header secondary window;
  • anotherwindow.cpp -  source file of secondary window.

Exterior windows

I created here the windows with the help of the designer interface.

Switch between windows. Main window

Switch between windows. secondary window

main.cpp

This file, which starts with an application created by default. Nothing here is not changing.

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

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

    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h

The header of the main window of the application you must include the header file window secondary application.

#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;
    // second and third windows
    AnotherWindow *sWindow;
    AnotherWindow *thirdWindow;
};

#endif // MAINWINDOW_H

mainwindow.cpp

Initialize both secondary windows are in the main window and use the signals and slots system, these windows are displayed on the signals from the main window buttons. At the same time the main window will be closed.

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // Initialize the second window
    sWindow = new AnotherWindow();
    // connected to the slot start the main window on the button in the second window
    connect(sWindow, &AnotherWindow::firstWindow, this, &MainWindow::show);

    // Initialize the third window
    thirdWindow = new AnotherWindow();
    // connected to the slot start the main window on the button in the third window
    connect(thirdWindow, &AnotherWindow::firstWindow, this, &MainWindow::show);
}

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

void MainWindow::on_pushButton_clicked()
{
    sWindow->show();  // Show a second window
    this->close();    // Close the main window
}

void MainWindow::on_pushButton_2_clicked()
{
    thirdWindow->show();  // Show a third window
    this->close();    // Close the main window
}

anotherwindow.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

anotherwindow.cpp

And likewise do the button handler in a secondary window. The difference is that the main window already exists, so we need to send a signal to the side of the main window, so that it opened.

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

Result. Switch between windows

As a result of such manipulations you will be able to switch between application windows, and at the same time you will be always open only one application window.

Video

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

m
  • March 18, 2018, 1:42 p.m.

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

Evgenii Legotckoi
  • March 18, 2018, 1:46 p.m.

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

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

Благодарю за столь быстрый ответ. Вы были правы, но теперь, когда я все пересоздал, появляется совсем иная проблема: :шибка: 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
  • March 19, 2018, 5:14 a.m.

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

ДК
  • Jan. 6, 2019, 10:12 a.m.
  • (edited)

Вот такая вот ошибка возникла когда пытался реализовать код. Понимаю что ошибка связана с указателем но не могу её исправить. Ошибка вылетает сразу после инициализации в 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
  • Jan. 6, 2019, 10:19 a.m.

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

MainWindow (sec = new second();)

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

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

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

ДК
  • Jan. 6, 2019, 11:21 a.m.
sec = new second();

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

НК
  • Feb. 5, 2019, 1:49 p.m.
  • (edited)

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

"Дима Коноплянка#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) "

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

Добрый день!

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

Спасибо

АИ
  • Feb. 9, 2019, 8:51 a.m.
  • (edited)

здраствуйте

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

Добрый день.

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

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

n
  • June 1, 2019, 2:14 p.m.

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

Evgenii Legotckoi
  • June 4, 2019, 6:01 a.m.

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

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

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

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

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

Evgenii Legotckoi
  • Dec. 9, 2019, 3:41 a.m.
  • (edited)

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

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

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

v
  • March 10, 2020, 8:46 a.m.

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

Evgenii Legotckoi
  • March 10, 2020, 8:55 a.m.

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

v
  • March 10, 2020, 9:31 a.m.

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

v
  • March 10, 2020, 5:44 p.m.

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

Evgenii Legotckoi
  • March 11, 2020, 4:22 a.m.
  • (edited)

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

В
  • July 3, 2020, 12:26 a.m.

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

Evgenii Legotckoi
  • July 3, 2020, 1:15 a.m.

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

А
  • Oct. 6, 2021, 9:47 a.m.

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

A
  • Jan. 12, 2022, 11:41 a.m.

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
AD

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
m

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:80points,
  • Rating points4
m

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:20points,
  • Rating points-10
Last comments
Evgenii Legotckoi
Evgenii LegotckoiNov. 1, 2024, 12:37 a.m.
Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEOct. 19, 2024, 6:19 p.m.
Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовOct. 5, 2024, 5:51 p.m.
Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5July 5, 2024, 9:02 p.m.
QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrFeb. 9, 2024, 5:43 a.m.
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Now discuss on the forum
Evgenii Legotckoi
Evgenii LegotckoiJune 25, 2024, 1:11 a.m.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Nov. 15, 2024, 5:04 p.m.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectJune 4, 2022, 1:49 p.m.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimOct. 25, 2024, 7:10 p.m.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Follow us in social networks