Intruder
April 20, 2020, 1:36 a.m.

Не могу разобраться с QWizard и QWizardPage

QWizard, QWizardPage

Всем доброго времени суток!

Помогите разобраться с этим двумя классами. Вроде делаю все по примеру из Help, но ничего не получается, а именно кнопка перехода далее не становится активной, хотя страницы добавляются.
Выкладываю текст своего Wizard (его первый вариант):
Текст заголовочного файла индексов страниц wizard

  1. #ifndef SHARED_DEFS_H
  2. #define SHARED_DEFS_H
  3.  
  4. enum {
  5. INTRO_PAGE,
  6. PARTNUMBER_PAGE,
  7. ALTIDENT_PAGE,
  8. CONNECTOR_PAGE_1,
  9. CONNECTOR_PAGE_2,
  10. REFERNCES_PAGE,
  11. FINAL_PAGE
  12. };
  13.  
  14. #endif // SHARED_DEFS_H
  15.  
  1. Создаю два страницы QWizardPage
  1. #ifndef INTROPAGE_H
  2. #define INTROPAGE_H
  3.  
  4. #include <QWizardPage>
  5.  
  6. enum standardPart {
  7. CONNECTOR,
  8. DISTRIBUTION_PART,
  9. ACCESSORY,
  10. SOLDER_SLEEVE,
  11. SHRINK_SLEEVE,
  12. IDENTIFICATION_SLEEVE,
  13. CONDUIT,
  14. WIRE_MATERIAL
  15. };
  16.  
  17. class QRadioButton;
  18. class QLabel;
  19.  
  20. class IntroPage: public QWizardPage
  21. {
  22. Q_OBJECT
  23. public:
  24. IntroPage( QWidget* parent = nullptr );
  25. // ~IntroPage(){}
  26.  
  27. int nextId() const override;
  28. void initializePage() override;
  29.  
  30. private:
  31. QLabel* m_standardpart;
  32. QLabel* m_select_lbl;
  33.  
  34. QRadioButton* m_connector_rbtn;
  35. QRadioButton* m_distriburionpart_rbtn;
  36. QRadioButton* m_accessoty_rbtn;
  37. QRadioButton* m_soldersleeve_rbtn;
  38. QRadioButton* m_shrinksleeve_rbtn;
  39. QRadioButton* m_identificationsleeve_rbtn;
  40. QRadioButton* m_conduit_rbtn;
  41. QRadioButton* m_wirematerial_rbtn;
  42. };
  43.  
  44. #endif // INTROPAGE_H
  1. #include "intropage.h"
  2.  
  3. #include <QRadioButton>
  4. #include <QLabel>
  5. #include <QBoxLayout>
  6.  
  7. #include "shared_defs.h"
  8.  
  9. IntroPage::IntroPage( QWidget* parent )
  10. : QWizardPage( parent )
  11. {
  12. setObjectName("introPage");
  13. setTitle(tr("Main page"));
  14. setSubTitle(tr("Electrical standard part with the subordinated item."));
  15.  
  16. QBoxLayout* mainLayout = new QVBoxLayout;
  17. mainLayout->addWidget(m_standardpart = new QLabel);
  18. mainLayout->addWidget(m_select_lbl = new QLabel);
  19. mainLayout->addWidget(m_connector_rbtn = new QRadioButton(tr("Connector")));
  20. mainLayout->addWidget(m_distriburionpart_rbtn = new QRadioButton(tr("Distribution part")));
  21. mainLayout->addWidget(m_accessoty_rbtn = new QRadioButton(tr("Accessory")));
  22. mainLayout->addWidget(m_soldersleeve_rbtn = new QRadioButton(tr("Solder sleeve")));
  23. mainLayout->addWidget(m_shrinksleeve_rbtn = new QRadioButton(tr("Shrink sleeve")));
  24. mainLayout->addWidget(m_identificationsleeve_rbtn = new QRadioButton(tr("Identification sleeve")));
  25. mainLayout->addWidget(m_conduit_rbtn = new QRadioButton(tr("Conduit")));
  26. mainLayout->addWidget(m_wirematerial_rbtn = new QRadioButton(tr("Wire material")));
  27. mainLayout->addStretch(1);
  28.  
  29. m_standardpart->setVisible(false);
  30.  
  31. registerField( "typeStandardpart*", m_standardpart);
  32. m_connector_rbtn->setChecked( true );
  33.  
  34. setLayout( mainLayout );
  35. }
  36.  
  37. int IntroPage::nextId() const
  38. {
  39. return PARTNUMBER_PAGE;
  40. }
  41.  
  42. void IntroPage::initializePage()
  43. {
  44. if(m_connector_rbtn->isChecked()){
  45. m_standardpart->setNum(standardPart::CONNECTOR);
  46. }else if(m_distriburionpart_rbtn->isChecked()){
  47. m_standardpart->setNum(standardPart::DISTRIBUTION_PART);
  48. }else if(m_accessoty_rbtn->isChecked()){
  49. m_standardpart->setNum(standardPart::ACCESSORY);
  50. }else if(m_soldersleeve_rbtn->isChecked()){
  51. m_standardpart->setNum(standardPart::SOLDER_SLEEVE);
  52. }else if(m_shrinksleeve_rbtn->isChecked()){
  53. m_standardpart->setNum(standardPart::SHRINK_SLEEVE);
  54. }else if(m_identificationsleeve_rbtn->isChecked()){
  55. m_standardpart->setNum(standardPart::IDENTIFICATION_SLEEVE);
  56. }else if(m_conduit_rbtn->isChecked()){
  57. m_standardpart->setNum(standardPart::CONDUIT);
  58. }else if(m_wirematerial_rbtn->isChecked()){
  59. m_standardpart->setNum(standardPart::WIRE_MATERIAL);
  60. }
  61. }
  1. #ifndef PARTNUMBERPAGE_H
  2. #define PARTNUMBERPAGE_H
  3.  
  4. #include <QWizardPage>
  5. class QLabel;
  6.  
  7. class PartNumberPage : public QWizardPage
  8. {
  9. Q_OBJECT
  10. public:
  11. PartNumberPage(QWidget* parent = nullptr);
  12. // ~PartNumberPage(){}
  13.  
  14. private:
  15. QLabel* m_test;
  16.  
  17.  
  18. // QWizardPage interface
  19. public:
  20. int nextId() const override;
  21. };
  22.  
  23. #endif // PARTNUMBERPAGE_H
  1. #include "partnumberpage.h"
  2.  
  3. #include <QLabel>
  4. #include <QBoxLayout>
  5.  
  6. #include "shared_defs.h"
  7.  
  8. PartNumberPage::PartNumberPage(QWidget* parent)
  9. : QWizardPage( parent )
  10. {
  11. setObjectName("partNumberPage");
  12. setTitle(tr("Part number"));
  13. setSubTitle(tr("Electrical standard part with the subordinated item."));
  14.  
  15. QBoxLayout* mainLayout = new QVBoxLayout;
  16. mainLayout->addWidget(m_test = new QLabel);
  17. }
  18.  
  19. int PartNumberPage::nextId() const
  20. {
  21. return ALTIDENT_PAGE;
  22. }
  23.  
  1. Код самого Wizard
  1. #ifndef WIZARDSTANDARDPART_H
  2. #define WIZARDSTANDARDPART_H
  3.  
  4. #include <QWizard>
  5. #include "intropage.h"
  6. #include "partnumberpage.h"
  7. #include "shared_defs.h"
  8.  
  9. namespace Ui {
  10. class WizardStandardPart;
  11. }
  12.  
  13. class WizardStandardPart : public QWizard
  14. {
  15. Q_OBJECT
  16.  
  17. public:
  18. explicit WizardStandardPart(QWidget *parent = nullptr);
  19. ~WizardStandardPart();
  20.  
  21. private:
  22. Ui::WizardStandardPart *ui;
  23.  
  24. };
  25.  
  26. #endif // WIZARDSTANDARDPART_H
  27.  
  1. #include "wizardstandardpart.h"
  2. #include "ui_wizardstandardpart.h"
  3.  
  4. #include "shared_defs.h"
  5.  
  6. WizardStandardPart::WizardStandardPart(QWidget *parent) :
  7. QWizard(parent),
  8. ui(new Ui::WizardStandardPart)
  9. {
  10. setWindowTitle(tr("License Wizard"));
  11. ui->setupUi(this);
  12. setPage(INTRO_PAGE, new IntroPage(this));
  13. setPage(PARTNUMBER_PAGE, new PartNumberPage(this));
  14.  
  15. setStartId(INTRO_PAGE);
  16. }
  17.  
  18. WizardStandardPart::~WizardStandardPart()
  19. {
  20. delete ui;
  21. }
  1. Как вызываю Wizard (mainwindow.cpp):
  1. ...
  2. void MainWindow::actionCreateStandardPartObject()
  3. {
  4. WizardStandardPart *wizardStandardPart = new WizardStandardPart();
  5. qDebug() << wizardStandardPart->page(INTRO_PAGE)->title();
  6. qDebug() << wizardStandardPart->page(PARTNUMBER_PAGE)->title();
  7. wizardStandardPart->exec();
  8. }
  9. ...

Вот что выводится при запуске wizard:
Не активная кнопка "Далее"

Но количество страниц в Wizard точно две, потому что я могу получить их свойсва title.

Всем спасибо за помощь заранее.
Делаю так первый раз, может быть что-то упускаю.

2

Do you like it? Share on social networks!

3
Evgenii Legotckoi
  • April 20, 2020, 1:06 p.m.

Добрый день

А там нет ещё какого-нибудь кода с кнопками. Мне кажется, что там что-то должно быть, чтобы делать кнопку активной.
Но я в упор не вижу у вас подобного кода.

    Intruder
    • April 20, 2020, 1:15 p.m.

    Евгений, добрый день.
    Я просмотрел кучу примеров и ничего подобного не нашел.
    Кнопки нигде не описываются. Для меня это тоже показалось странным. Я подумал, что это отдается на откуп самому wizard.

      Evgenii Legotckoi
      • April 20, 2020, 1:20 p.m.

      Ну вообще у меня есть ещё такая мысль, что необходимо вызывать соответсвующие методы родительского класса страницы

      1. void IntroPage::initializePage()
      2. {
      3. if(m_connector_rbtn->isChecked()){
      4. m_standardpart->setNum(standardPart::CONNECTOR);
      5. }else if(m_distriburionpart_rbtn->isChecked()){
      6. m_standardpart->setNum(standardPart::DISTRIBUTION_PART);
      7. }else if(m_accessoty_rbtn->isChecked()){
      8. m_standardpart->setNum(standardPart::ACCESSORY);
      9. }else if(m_soldersleeve_rbtn->isChecked()){
      10. m_standardpart->setNum(standardPart::SOLDER_SLEEVE);
      11. }else if(m_shrinksleeve_rbtn->isChecked()){
      12. m_standardpart->setNum(standardPart::SHRINK_SLEEVE);
      13. }else if(m_identificationsleeve_rbtn->isChecked()){
      14. m_standardpart->setNum(standardPart::IDENTIFICATION_SLEEVE);
      15. }else if(m_conduit_rbtn->isChecked()){
      16. m_standardpart->setNum(standardPart::CONDUIT);
      17. }else if(m_wirematerial_rbtn->isChecked()){
      18. m_standardpart->setNum(standardPart::WIRE_MATERIAL);
      19. }
      20.  
      21. QWizardPage::initializePage();
      22. }

        Comments

        Only authorized users can post comments.
        Please, Log in or Sign up
        • Last comments
        • AK
          April 1, 2025, 11:41 a.m.
          Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
        • Evgenii Legotckoi
          March 9, 2025, 9:02 p.m.
          К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
        • VP
          March 9, 2025, 4:14 p.m.
          Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
        • ИМ
          Nov. 22, 2024, 9:51 p.m.
          Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        • Evgenii Legotckoi
          Oct. 31, 2024, 11:37 p.m.
          Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup