Глава 32 – Диалоговые окна

Диалоговые окна

Приобрести книгу можно на сайте ozon.ru и в электронном виде на Google Play:
Приобрести книгу о Qt и C++ на Ozon.ru Купить книгу о Qt и C++ на Goole Play

13 thoughts on “Глава 32 – Диалоговые окна

  1. Здравствуйте, Макс!
    В главе 32 приводится пример программы создания собственного диалогового окна. Поставил дополнительную задачу: если значение полей First Name и Last Name (QLineEdit) равно “Иван” или “Иванов”, то выделяй текст.
    Реализовал это с помощью создания нового класса MyLineEdit наслудуемого от класса QLineEdit. В классе InputDialog использую элементы своего класса (MyLineEdit).
    объявление:
    class MyLineEdit : public QLineEdit {
    Q_OBJECT

    protected:
    virtual void mousePressEvent(QMouseEvent *) override;
    };

    реализация:
    void MyLineEdit::mousePressEvent(QMouseEvent *) {
    if(text() == “Иван” || text() == “Иванов”) selectAll();
    }

    Если в текстовом поле вписаны слова “Иван” или “Иванов”, то они выделяются, как и было задумано, но если в поле вписаны другие слова, то появляется следующая проблема – не получается курсор с помощью указателя мыши постадвить в нужное место текста (только в конец текста). Т.е. если в текстовое поле (MyLineEdit) вписано, например, “Александра”, я не могу с помощью указателя мыши установить курсор в середину слова (например, между буквами “к” и “с”). Почему так происходит, объясните, пожалуйста? Есть ли возможность это исправить? Возможно эту задачу можно решить иным способом…

    1. Здравствуйте, Вячеслав!
      скорее всего Вы просто забыли передать объект события дальше в наследованный класс. То есть код должен вяглядить так
      void MyLineEdit::mousePressEvent(QMouseEvent* pe) {
      if(text() == “Иван” || text() == “Иванов”) selectAll();
      QLineEdit::mousePressEvent(pe); //!!! передаем объект события дальше
      }

      1. Макс, огромное спасибо за оперативный ответ! Да, всё работает, единственное код должен быть таким в моем случае:
        void MyLineEdit::mousePressEvent(QMouseEvent *pe) {
        if(text() == “Иван” || text() == “Иванов”) selectAll();
        else QLineEdit::mousePressEvent(pe);
        }
        Иначе, при клике мышкой по текстовому полю текст не выделяется, как предполагалось (возможно это условие я не обозначил изначально). Смысл условия такой: в поля вписаны имя и фамилия как пример, но при клике мышкой по полю, если там вписаны “Иван”, или “Иванов”, слово-пример должно выделяться, чтобы можно было сразу вводить свои имя и фамилию (если данные, “Иван” и “Иванов”, не подходят).
        Спасибо большое за подсказку!

  2. В Главе 32 опечатки на стр. 451: “Метод firstName() возвращает введенную пользователем фамилию…”, имеется ввиду метод lastName(). И на стр. 453: “Затем создаем объект строкового типа strFormat – …”, если брать из листинга, то имелся ввиду объект типа QString – strFilter.

  3. На стр.459 опечатка в предложении: “В процессе выполнения операции должен вызываться метод setProgress()”, имеется ввиду метод(слот) setValue().

  4. Макс, здравствуйте!
    В коде на странице 462 Вы объект pmbx создаете динамически и потом удаляете его. Корректно ли создавать объект статически, например следующим образом:
    //————————————————————————————————-
    QMessageBox mbx;
    mbx.setWindowTitle(“Внимание!”);
    mbx.setText(“Документ не сохранён. Сохранить его?”);
    mbx.addButton(“Да”, QMessageBox::YesRole); // Yes
    mbx.addButton(“Нет”, QMessageBox::NoRole); // No
    mbx.addButton(“Отмена”, QMessageBox::RejectRole); // Cancel
    mbx.setIcon(QMessageBox::Warning);

    int n = mbx.exec();
    // ……..
    //————————————————————————————————-
    Или это некорректно с позиции Qt? В чем различие, кроме того, что один создается в куче, а другой в стеке?

    1. Здравствуйте, Вячеслав. Создавать модальные диалоговые окна из методов статически, вполне корректно, ведь метод exec() запустит цикл обработки событий и остановит далнейшее исполнение кода метода, в котором он был создан. После того как пользователь закроет окно диалога, продолжится выполнение кода метода и в конце произойдет разрушение объетка окна диалога. Но это только в случае модального диалога. С исполнением блокирующего метода exec(). Если же окно не модальное созданно статически и его показ производится вызовом метод show(), то блокировки кода метода, из которого он запущен, не будет и в результате пользователь этого окна даже не увидет. Поэтому такие окна нужно будет создавать динамически. Надеюсь что немного прояснил ситуацию. Если что непонятно то спрашивайте, я постораюсь уточнить.

  5. Здравствуйте! На странице 450 книги во фразе “Сигналы
    clicked() кнопок Ok и Cancel (Отмена) соединяются со слотами accept() и rejected()
    соответственно”, как мне кажется, “rejected” следует заменить на “reject”.

    1. Дмитрий, действительно это опечатка, правильно будет reject().

  6. Здравствуйте! На странице 459 книги упоминается метод QProgressDialog::setTotalSteps(), однако, в данном классе такой метод отсутствует. Вместо него, думаю, по смыслу могут используются методы setMinimum(), setMaximum() или setRange()

    1. Спасибо Дмитрий! Функция setTotalSteps(), диалога QProgressDialog, это артефакт Qt3. Этой функции в Qt5 уже нет и вместо нее, для создания количества шагов, нужно использовать, как Вы уже сказали, методы setMinimum() и setMaximum().

Leave a Reply to Max Schlee Cancel reply

Your email address will not be published.

Please reload

Please Wait