Приобрести книгу можно на сайте ozon.ru и в электронном виде на Google Play:
13 thoughts on “Глава 32 – Диалоговые окна”
Здравствуйте, Макс!
В главе 32 приводится пример программы создания собственного диалогового окна. Поставил дополнительную задачу: если значение полей First Name и Last Name (QLineEdit) равно “Иван” или “Иванов”, то выделяй текст.
Реализовал это с помощью создания нового класса MyLineEdit наслудуемого от класса QLineEdit. В классе InputDialog использую элементы своего класса (MyLineEdit).
объявление:
class MyLineEdit : public QLineEdit {
Q_OBJECT
Если в текстовом поле вписаны слова “Иван” или “Иванов”, то они выделяются, как и было задумано, но если в поле вписаны другие слова, то появляется следующая проблема – не получается курсор с помощью указателя мыши постадвить в нужное место текста (только в конец текста). Т.е. если в текстовое поле (MyLineEdit) вписано, например, “Александра”, я не могу с помощью указателя мыши установить курсор в середину слова (например, между буквами “к” и “с”). Почему так происходит, объясните, пожалуйста? Есть ли возможность это исправить? Возможно эту задачу можно решить иным способом…
Здравствуйте, Вячеслав!
скорее всего Вы просто забыли передать объект события дальше в наследованный класс. То есть код должен вяглядить так
void MyLineEdit::mousePressEvent(QMouseEvent* pe) {
if(text() == “Иван” || text() == “Иванов”) selectAll();
QLineEdit::mousePressEvent(pe); //!!! передаем объект события дальше
}
Макс, огромное спасибо за оперативный ответ! Да, всё работает, единственное код должен быть таким в моем случае:
void MyLineEdit::mousePressEvent(QMouseEvent *pe) {
if(text() == “Иван” || text() == “Иванов”) selectAll();
else QLineEdit::mousePressEvent(pe);
}
Иначе, при клике мышкой по текстовому полю текст не выделяется, как предполагалось (возможно это условие я не обозначил изначально). Смысл условия такой: в поля вписаны имя и фамилия как пример, но при клике мышкой по полю, если там вписаны “Иван”, или “Иванов”, слово-пример должно выделяться, чтобы можно было сразу вводить свои имя и фамилию (если данные, “Иван” и “Иванов”, не подходят).
Спасибо большое за подсказку!
В Главе 32 опечатки на стр. 451: “Метод firstName() возвращает введенную пользователем фамилию…”, имеется ввиду метод lastName(). И на стр. 453: “Затем создаем объект строкового типа strFormat – …”, если брать из листинга, то имелся ввиду объект типа QString – strFilter.
Макс, здравствуйте!
В коде на странице 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? В чем различие, кроме того, что один создается в куче, а другой в стеке?
Здравствуйте, Вячеслав. Создавать модальные диалоговые окна из методов статически, вполне корректно, ведь метод exec() запустит цикл обработки событий и остановит далнейшее исполнение кода метода, в котором он был создан. После того как пользователь закроет окно диалога, продолжится выполнение кода метода и в конце произойдет разрушение объетка окна диалога. Но это только в случае модального диалога. С исполнением блокирующего метода exec(). Если же окно не модальное созданно статически и его показ производится вызовом метод show(), то блокировки кода метода, из которого он запущен, не будет и в результате пользователь этого окна даже не увидет. Поэтому такие окна нужно будет создавать динамически. Надеюсь что немного прояснил ситуацию. Если что непонятно то спрашивайте, я постораюсь уточнить.
Здравствуйте! На странице 450 книги во фразе “Сигналы
clicked() кнопок Ok и Cancel (Отмена) соединяются со слотами accept() и rejected()
соответственно”, как мне кажется, “rejected” следует заменить на “reject”.
Здравствуйте! На странице 459 книги упоминается метод QProgressDialog::setTotalSteps(), однако, в данном классе такой метод отсутствует. Вместо него, думаю, по смыслу могут используются методы setMinimum(), setMaximum() или setRange()
Спасибо Дмитрий! Функция setTotalSteps(), диалога QProgressDialog, это артефакт Qt3. Этой функции в Qt5 уже нет и вместо нее, для создания количества шагов, нужно использовать, как Вы уже сказали, методы setMinimum() и setMaximum().
Здравствуйте, Макс!
В главе 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) вписано, например, “Александра”, я не могу с помощью указателя мыши установить курсор в середину слова (например, между буквами “к” и “с”). Почему так происходит, объясните, пожалуйста? Есть ли возможность это исправить? Возможно эту задачу можно решить иным способом…
Здравствуйте, Вячеслав!
скорее всего Вы просто забыли передать объект события дальше в наследованный класс. То есть код должен вяглядить так
void MyLineEdit::mousePressEvent(QMouseEvent* pe) {
if(text() == “Иван” || text() == “Иванов”) selectAll();
QLineEdit::mousePressEvent(pe); //!!! передаем объект события дальше
}
Макс, огромное спасибо за оперативный ответ! Да, всё работает, единственное код должен быть таким в моем случае:
void MyLineEdit::mousePressEvent(QMouseEvent *pe) {
if(text() == “Иван” || text() == “Иванов”) selectAll();
else QLineEdit::mousePressEvent(pe);
}
Иначе, при клике мышкой по текстовому полю текст не выделяется, как предполагалось (возможно это условие я не обозначил изначально). Смысл условия такой: в поля вписаны имя и фамилия как пример, но при клике мышкой по полю, если там вписаны “Иван”, или “Иванов”, слово-пример должно выделяться, чтобы можно было сразу вводить свои имя и фамилию (если данные, “Иван” и “Иванов”, не подходят).
Спасибо большое за подсказку!
В Главе 32 опечатки на стр. 451: “Метод firstName() возвращает введенную пользователем фамилию…”, имеется ввиду метод lastName(). И на стр. 453: “Затем создаем объект строкового типа strFormat – …”, если брать из листинга, то имелся ввиду объект типа QString – strFilter.
Да, это опечатки. Спасибо!
На стр.459 опечатка в предложении: “В процессе выполнения операции должен вызываться метод setProgress()”, имеется ввиду метод(слот) setValue().
Спасибо Вячеслав, за найденную опечатку. Должно быть setValue().
Макс, здравствуйте!
В коде на странице 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? В чем различие, кроме того, что один создается в куче, а другой в стеке?
Здравствуйте, Вячеслав. Создавать модальные диалоговые окна из методов статически, вполне корректно, ведь метод exec() запустит цикл обработки событий и остановит далнейшее исполнение кода метода, в котором он был создан. После того как пользователь закроет окно диалога, продолжится выполнение кода метода и в конце произойдет разрушение объетка окна диалога. Но это только в случае модального диалога. С исполнением блокирующего метода exec(). Если же окно не модальное созданно статически и его показ производится вызовом метод show(), то блокировки кода метода, из которого он запущен, не будет и в результате пользователь этого окна даже не увидет. Поэтому такие окна нужно будет создавать динамически. Надеюсь что немного прояснил ситуацию. Если что непонятно то спрашивайте, я постораюсь уточнить.
Здравствуйте! На странице 450 книги во фразе “Сигналы
clicked() кнопок Ok и Cancel (Отмена) соединяются со слотами accept() и rejected()
соответственно”, как мне кажется, “rejected” следует заменить на “reject”.
Дмитрий, действительно это опечатка, правильно будет reject().
Здравствуйте! На странице 459 книги упоминается метод QProgressDialog::setTotalSteps(), однако, в данном классе такой метод отсутствует. Вместо него, думаю, по смыслу могут используются методы setMinimum(), setMaximum() или setRange()
Спасибо Дмитрий! Функция setTotalSteps(), диалога QProgressDialog, это артефакт Qt3. Этой функции в Qt5 уже нет и вместо нее, для создания количества шагов, нужно использовать, как Вы уже сказали, методы setMinimum() и setMaximum().