Trong hộp thoại, khi nhấn phím phím, tiêu điểm sẽ thay đổi thành tiện ích con khác. Trong Qt, có bất kỳ tín hiệu nào khi một tiện ích mất tiêu điểm của nó không? Tôi có thể sử dụng nó để kiểm tra xem đầu vào có hợp lệ hay không? Nếu không, tôi có thể đặt lấy nét lại và yêu cầu người dùng nhập lại không?Tín hiệu khi một tiện ích mất tiêu điểm là gì?
Trả lời
Không có tín hiệu nhưng nếu bạn muốn biết khi nào tiện ích của bạn bị mất tiêu điểm, ghi đè và thực hiện lại void QWidget::focusOutEvent(QFocusEvent* event)
trong tiện ích của bạn. Nó sẽ được gọi bất cứ khi nào widget của bạn bị mất tiêu điểm. Để tập trung vào một tiện ích, hãy sử dụng QWidget::setFocus(Qt::FocusReason)
.
Để xác nhận đầu vào trong một QLineEdit
hoặc QComboBox
bạn có thể phân lớp QValidator
và thực hiện xác nhận của riêng bạn, hoặc sử dụng một trong những lớp con hiện có, QIntValidator
, QDoubleValidator
, hoặc QRegExpValidator
. Đặt trình xác thực với các số QLineEdit::setValidator(const QValidator*)
và QComboBox::setValidator(const QValidator*)
tương ứng.
Nếu bạn muốn xác nhận nội dung của một hộp thoại modal, một trong những cách sẽ được ghi đè QDialog::exec()
với một thực hiện như thế này:
int MyDialog::exec() {
while (true) {
if (QDialog::exec() == QDialog::Rejected) {
return QDialog::Rejected;
}
if (validate()) {
return QDialog::Accepted;
}
}
}
bool MyDialog::validate() {
if (lineEdit->text().isEmpty()) {
QMessageBox::critical(this, "Invalid value", "The specified value is not valid");
lineEdit->setFocus();
lineEdit->selectAll();
return false;
}
return true;
}
Nó sẽ không cho phép người dùng để đóng hộp thoại với OK hoặc bất kỳ nút nào khác có vai trò Đã chấp nhận trừ khi nội dung của hộp thoại được xác thực thành công. Trong ví dụ này, tôi giả định hộp thoại có QLineEdit
có tên là lineEdit
và chức năng validate
sẽ đảm bảo rằng nội dung của nó không trống. Nếu có, nó sẽ đặt tiêu điểm thành QLineEdit
và hiển thị lại hộp thoại.
Có một tín hiệu - ['QApplication :: focusChanged'] (http://qt-project.org/doc/qt-5.0/qtwidgets/qapplication.html#focusChanged). – sashoalm
[sashoalm] (https://stackoverflow.com/users/492336/sashoalm) 's pithy bình luận nên là câu trả lời được chấp nhận. Tất nhiên, nó không hoạt động như thế. Xem xét upvoting [câu trả lời tương tự này] (https://stackoverflow.com/a/321677/2809027) tại [câu hỏi trùng lặp này] (https://stackoverflow.com/questions/321656/get-a-notification-event-signal -when-a-qt-widget-được-tập trung) để thay thế. '' –
Cũng có thể (và dễ dàng hơn) để tạo ra các tín hiệu cho mình
Trong cpp (đừng quên để bao gồm các moc)
class FocusWatcher : public QObject
{
Q_OBJECT
public:
explicit FocusWatcher(QObject* parent = nullptr) : QObject(parent)
{
if (parent)
parent->installEventFilter(this);
}
virtual bool eventFilter(QObject *obj, QEvent *event) override
{
Q_UNUSED(obj)
if (event->type() == QEvent::FocusIn)
emit focusChanged(true);
else if (event->type() == QEvent::FocusOut)
emit focusChanged(false);
return false;
}
Q_SIGNALS:
void focusChanged(bool in);
};
Và để kết nối nó:
connect(new FocusWatcher(myWidget), &FocusWatcher::focusChanged, this, &View::doSomething);
- 1. Tín hiệu phát ra nếu tất cả các tiện ích con bị mất tiêu điểm
- 2. Nhận thông báo/sự kiện/tín hiệu khi tiện ích Qt được lấy nét
- 3. Mất tiện ích khi sử dụng FileReference tải xuống
- 4. Tiện ích trong Android là gì?
- 5. Cách tốt nhất để tránh mất tiêu điểm TextBox khi có lỗi xác thực là gì?
- 6. Tín hiệu và khe cắm là gì?
- 7. Cách nhận tiện ích người gửi bằng cơ chế tín hiệu/khe?
- 8. Điểm nhấn của tiêu điểm là gì?
- 9. Thư viện/tiện ích/tiện ích mảng javascript tốt nhất là gì?
- 10. Ẩn bàn phím khi bị mất tiêu điểm khỏi UISearchBar
- 11. Chạy JavaScript khi phần tử mất tiêu điểm
- 12. Cách ưa thích để tạo tín hiệu tín hiệu kết hợp với tín hiệu và hoàn thành khi hoàn thành hoặc lỗi là gì?
- 13. tắt tính năng làm mới trang khi mất tiêu điểm
- 14. Tiện ích WPF hữu ích
- 15. Tiện ích của tệp C++ trống là gì?
- 16. Tiện ích mở rộng ký hiệu có ký hiệu dài
- 17. Tiện ích tar tốt cho Windows là gì?
- 18. Textmate2 lưu trên tiêu điểm bị mất
- 19. Tiện ích của thuộc tính GeneratedCodeAttribute trong C# là gì?
- 20. Mã thoát là gì từ tiện ích taskkill?
- 21. Tiện ích nén unix tốt nhất là gì?
- 22. 'Xóa khối' trong tiện ích `mkfs.jffs2 'trong Linux là gì?
- 23. Chủ đề điều phối tín hiệu java là gì?
- 24. GWT: Làm cách nào để xóa chỉ báo tiêu điểm của tiện ích Canvas?
- 25. Chủ đề Python + ngữ nghĩa tín hiệu Unix là gì?
- 26. Kết hợp nhiều tiện ích vào một trong Qt
- 27. Tiện ích Linux để mangle một tên biểu tượng C++ là gì?
- 28. Làm cách nào để đặt tiêu điểm cho tiện ích con nút theo lập trình?
- 29. wxPython: Làm cách nào để tìm ra tiện ích con nào có tiêu điểm?
- 30. Tiện ích Diff có nghĩa là C++
Nếu bạn quan tâm đến một 'QLineEdit' mất tiêu điểm, tín hiệu' QLineEdit :: editingFinished() 'sẽ nắm bắt sự kiện đó. – waldyrious