Evgenii Legotckoi
Evgenii LegotckoiҚаз. 24, 2015, 1:37 Т.Қ.

Qt/C++ - 038-сабақ. Qt тіліндегі терезелер арасында ауысу

Күні кеше бір оқырманым интернеттен жауап іздеп жүрген сұрағымен көмек сұрады. Менің бос уақытым көп емес, бірақ жұлдыздар бір-біріне сәйкестендірілді, сондықтан уақыт болды және тәжірибе бар адамдар санатынан сұрақ болды.

Мәселен, мәселенің мәні негізгі терезе мен қосалқы терезелер арасында ауысуды ұйымдастыру болды. Иә, ашық терезе жабылып, орнына екінші терезе ашылатындай. Яғни, қолданбаның негізгі терезесіндегі түймені басу арқылы басқа терезені ашыңыз және сонымен бірге негізгі терезені жабыңыз. Бұл ретте екінші терезеде батырма бар, оны басу арқылы негізгі терезе ашылады, ал екінші терезе сәйкесінше жабылады.

Жоба құрылымы

Жоба құрылымы әдепкіден қосымша терезелерге жауап беретін қосымша сыныптың болуымен ерекшеленеді.

  • anotherwindow.h - терезе тақырыбының қосымша файлы;
  • anotherwindow.cpp - терезенің қосымша бастапқы код файлы.

Терезелердің пайда болуы

Біз бұл терезелерді интерфейс дизайнерінің көмегімен және бағдарлама кодына барар жолда лақтырамыз.

Терезелер арасында ауысу. Негізгі терезе

Терезелер арасында ауысу. Қосымша терезе

main.cpp

Қолданба басталатын бұл файл әдепкі бойынша жасалады. Біз мұнда ештеңені өзгертпейміз.

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

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

    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h

Негізгі қолданба терезесінің тақырып файлында қосымша қолданба терезесінің тақырып файлын қосу керек.

#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

Қосалқы терезелердің екеуі де негізгі терезеде инициализацияланады және сигналдар мен слоттар жүйесінің көмегімен бұл терезелер негізгі терезедегі түймелердің сигналдары арқылы көрсетіледі. Бұл негізгі терезені жабады.

#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();    // Закрываем основное окно
}

басқа терезе.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

Сол сияқты біз қосымша терезеде түйме өңдеушісін жасаймыз. Айырмашылығы - негізгі терезе бұрыннан бар, сондықтан оны ашу үшін негізгі терезеге сигнал жіберу керек.

#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(); // И вызываем сигнал на открытие главного окна
}

Түйіндеме. Терезелер арасында ауысу

Осындай манипуляциялардың нәтижесінде сіз қолданба терезелері арасында ауыса аласыз және сонымен бірге сізде әрқашан тек бір қолданба терезесі ашық болады. Қолданбаның демонстрациясын бейне оқулықтан көре аласыз.

Бейне оқулық

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

m
  • Наурыз 18, 2018, 1:42 Т.Қ.

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

Evgenii Legotckoi
  • Наурыз 18, 2018, 1:46 Т.Қ.

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

Создали форму, удалили форму, не перезапустили qmake, поэтому скорее всего и не находит ту форму в проекте.
m
  • Наурыз 18, 2018, 2: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, 2018, 5:14 Т.Ж.

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

ДК
  • Қаң. 6, 2019, 10: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)

Evgenii Legotckoi
  • Қаң. 6, 2019, 10:19 Т.Ж.

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

MainWindow (sec = new second();)

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

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

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

ДК
  • Қаң. 6, 2019, 11:21 Т.Ж.
sec = new second();

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

НК
  • Ақп. 5, 2019, 1:49 Т.Қ.
  • (өңделген)

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

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

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

Evgenii Legotckoi
  • Ақп. 5, 2019, 2:10 Т.Қ.

Добрый день!

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

Спасибо

АИ
  • Ақп. 9, 2019, 8:51 Т.Ж.
  • (өңделген)

здраствуйте

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

Evgenii Legotckoi
  • Ақп. 11, 2019, 4:35 Т.Ж.

Добрый день.

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

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

n
  • Маусым 1, 2019, 2:14 Т.Қ.

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

Evgenii Legotckoi
  • Маусым 4, 2019, 6:01 Т.Ж.

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

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

НБ
  • Жел. 9, 2019, 3:05 Т.Ж.

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

Evgenii Legotckoi
  • Жел. 9, 2019, 3:14 Т.Ж.

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

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

Evgenii Legotckoi
  • Жел. 9, 2019, 3:41 Т.Ж.
  • (өңделген)

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

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

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

v
  • Наурыз 10, 2020, 8:46 Т.Ж.

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

Evgenii Legotckoi
  • Наурыз 10, 2020, 8:55 Т.Ж.

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

v
  • Наурыз 10, 2020, 9:31 Т.Ж.

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

v
  • Наурыз 10, 2020, 5:44 Т.Қ.

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

Evgenii Legotckoi
  • Наурыз 11, 2020, 4:22 Т.Ж.
  • (өңделген)

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

В
  • Шілде 3, 2020, 12:26 Т.Ж.

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

Evgenii Legotckoi
  • Шілде 3, 2020, 1:15 Т.Ж.

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

А
  • Қаз. 6, 2021, 9:47 Т.Ж.

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

A
  • Қаң. 12, 2022, 11:41 Т.Ж.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Бізді әлеуметтік желілерде бақылаңыз