Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB

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

QMainWindow, QWindow, переключение

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

m

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

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

Создали форму, удалили форму, не перезапустили qmake, поэтому скорее всего и не находит ту форму в проекте.
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

У вас 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();)

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

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

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

ДК
sec = new second();

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

НК

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

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

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

Добрый день!

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

НК

Спасибо

АИ

здраствуйте

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

Добрый день.

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

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Last comments
Feb. 21, 2019, 12:51 p.m.
Евгений Легоцкой

Иногда CMake приходится перезапускать начисто, не обновляет кэш
R
Feb. 21, 2019, 12:29 p.m.
RandyGallup

Я указал данные строки, т.к. без них у меня вылетала следующая ошибка: By not providing "FindQt5Core.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configurat...
Feb. 21, 2019, 12:08 p.m.
BlinCT

Вот атк выглядит мой проектник, посмотрите его. cmake_minimum_required(VERSION 3.6)project(projecttimer)set(CMAKE_CXX_STANDARD 11)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)find_packa...
Feb. 21, 2019, 12:04 p.m.
BlinCT

Смотрите, если вы используете глобально для проекта -DCMAKE_PREFIX_PATH= то вам не надо уже указывать вот эти строкиset(Qt5Core_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Core")set(Qt5Gui_DIR...
R
Feb. 21, 2019, 11:54 a.m.
RandyGallup

Даже не запускается. main.cpp у меня точно такой же, как в статье. CMakeLists.txt пришлось немного подправить (прикрепил ниже), т.к. не находились некоторые файлы. cmake_minimum_requi...
Now discuss on the forum
Feb. 21, 2019, 8:58 a.m.
Евгений Легоцкой

Ну у меня координаты передавались в зависимости от положения курсора мыши, а в вам по сути нужно будет аналогичным способом посылать даннные из полей ввода. Так что здесь скорее интерфес...
Feb. 20, 2019, 9:55 p.m.
Евгений Легоцкой

Не до конца понимаю сути вопроса, наверное, нужно увидеть программный код и попытку его применения, но к методам базового класса можно обращаться в наследованном классе через вызов по имени ба...
MU
Feb. 20, 2019, 3:06 p.m.
Maciej Urmański

Yes, ok I have solution! Thank you for directing me about annotate.:) Solution is: users_in = User.objects.filter(joined_users__goal=goal, joined_users__joined=True)
Feb. 20, 2019, 2:40 p.m.
Евгений Легоцкой

Думаю, что ещё можно переопределить mouseReleaseEvent(QMouseEvent* event) у QTableView, который содержит модель и немного поиграться с индексом. Если это индекс, который соответству...
Feb. 20, 2019, 10:34 a.m.
Евгений Легоцкой

Да, так тоже можно. Единственный момент в том, что lupdate не всегда понимает, к какому контексту это дело относится, и может запихать в левый контекст. В небольшом проекте это не критич...
Join us in social networks

For registered users on the site there is a minimum amount of advertising