Күні кеше бір оқырманым интернеттен жауап іздеп жүрген сұрағымен көмек сұрады. Менің бос уақытым көп емес, бірақ жұлдыздар бір-біріне сәйкестендірілді, сондықтан уақыт болды және тәжірибе бар адамдар санатынан сұрақ болды.
Мәселен, мәселенің мәні негізгі терезе мен қосалқы терезелер арасында ауысуды ұйымдастыру болды. Иә, ашық терезе жабылып, орнына екінші терезе ашылатындай. Яғни, қолданбаның негізгі терезесіндегі түймені басу арқылы басқа терезені ашыңыз және сонымен бірге негізгі терезені жабыңыз. Бұл ретте екінші терезеде батырма бар, оны басу арқылы негізгі терезе ашылады, ал екінші терезе сәйкесінше жабылады.
Жоба құрылымы
Жоба құрылымы әдепкіден қосымша терезелерге жауап беретін қосымша сыныптың болуымен ерекшеленеді.
- 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(); // И вызываем сигнал на открытие главного окна }
Түйіндеме. Терезелер арасында ауысу
Осындай манипуляциялардың нәтижесінде сіз қолданба терезелері арасында ауыса аласыз және сонымен бірге сізде әрқашан тек бір қолданба терезесі ашық болады. Қолданбаның демонстрациясын бейне оқулықтан көре аласыз.
Добрый вечер.
Делал все по вашу примеру, только почему-то не выходит. Выдает ошибку:"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 раз запускаешь игру она уже закончена, а мне надо чтобы игра началась заного.