Приобрести книгу можно на сайте ozon.ru и в электронном виде на Google Play:
15 Replies to “Глава 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().
При запуске листинга в IDE код отрабатывает нормально, окно диалога появляется, файл сохраняется, но IDE отображает приложение запущенным.
В диспетчере задач так же висит приложение.
Как закрыть такое приложение программно?
Пробовал QApplication::quit() и QApplication::exit() перед app.exec(), и внутри бокса if. Не работает.
И вообще, как закрывать приложения, которые не “показываются”?
This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish.AcceptRead More
Privacy & Cookies Policy
Privacy Overview
This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.
Здравствуйте, Макс!
В главе 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().
Добрый день!
Вопрос по листингу 32.7
При запуске листинга в IDE код отрабатывает нормально, окно диалога появляется, файл сохраняется, но IDE отображает приложение запущенным.
В диспетчере задач так же висит приложение.
Как закрыть такое приложение программно?
Пробовал QApplication::quit() и QApplication::exit() перед app.exec(), и внутри бокса if. Не работает.
И вообще, как закрывать приложения, которые не “показываются”?
Здравствуйте, Макс!
Извините за примитивный вопрос. Как в MessageBox поместить мой рисунок (файл типа jpg)?
С уважением, Валерий Фурман.