Tengo un QLineEdit
, con un objeto QCompleter
asociado. Si el usuario ingresa al menos un carácter, se muestra el menú emergente del QCompleter
, pero cuando el usuario elimina el último carácter (dejando el campo vacío), la ventana emergente desaparece. ¿Hay alguna manera de mostrarlo incluso cuando el texto QLineEdit
está vacío?Un QLineEdit con un QCompleter no mostrará el menú emergente del QCompleter con un campo de texto vacío
5
A
Respuesta
10
usted debería ser capaz de forzar la ventana emergente de más completa para conseguir muestra una vez que su texto línea de edición se borra mediante el uso de QCompliter::complete ranura:
lineEdit->completer()->complete();
Así es como puede hacerlo:
- definir TextChanged ranura para su lineedit;
- anula el método customEvent para tu ventana;
- en la ranura de texto enviado evento de usuario a la ventana siempre que el texto de lineedit tenga longitud cero;
- en el método customEvent mostrar completo cada vez que se recibe un evento de usuario;
A continuación se muestra un ejemplo:
mainwindow.h:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void customEvent(QEvent * event);
private:
Ui::MainWindow *ui;
private slots:
void on_lineEdit_textChanged(QString);
};
mainwindow.cpp:
class CompleteEvent : public QEvent
{
public:
CompleteEvent(QLineEdit *lineEdit) : QEvent(QEvent::User), m_lineEdit(lineEdit) { }
void complete()
{
m_lineEdit->completer()->complete();
}
private:
QLineEdit *m_lineEdit;
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QStringList wordList;
wordList << "one" << "two" << "three" << "four";
QLineEdit *lineEdit = new QLineEdit(this);
lineEdit->setGeometry(20, 20, 200, 30);
connect(lineEdit, SIGNAL(textChanged(QString)), SLOT(on_lineEdit_textChanged(QString)));
QCompleter *completer = new QCompleter(wordList, this);
completer->setCaseSensitivity(Qt::CaseInsensitive);
completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
lineEdit->setCompleter(completer);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::customEvent(QEvent * event)
{
QMainWindow::customEvent(event);
if (event->type()==QEvent::User)
((CompleteEvent*)event)->complete();
}
void MainWindow::on_lineEdit_textChanged(QString text)
{
if (text.length()==0)
QApplication::postEvent(this, new CompleteEvent((QLineEdit*)sender()));
}
esperanza que esta ayuda, que se refiere a
0
Aquí está mi solución basado en la respuesta de serge_gubenko Esta clase utiliza QStringListModel, pero se puede reemplazar fácilmente con cualquier otro modelo.
Completer_line_edit.h
#include <QLineEdit>
#include <QStringListModel>
#include <QTimer>
/*! Line edit widget with auto completion based on QStringListModel.
Modified behaviour: completion list will appear even when contents of
line edit is empty. Full list of options will be showed when line edit
has focus and is empty.
*/
class Completer_line_edit : public QLineEdit {
Q_OBJECT
public:
explicit Completer_line_edit(QWidget *parent = 0);
//! Set list of options used for copmletion.
inline void set_list(QStringList list) { model.setStringList(list); }
private:
QStringListModel model;
void focusInEvent(QFocusEvent *e);
void customEvent(QEvent* e);
QTimer timer;
private slots:
void slot_text_edited();
void slot_call_popup();
};
Completer_line_edit.cpp
#include "Completer_line_edit.h"
#include <QCompleter>
#include <QEvent>
#include <QApplication>
Completer_line_edit::Completer_line_edit(QWidget *parent) :
QLineEdit(parent)
{
setCompleter(new QCompleter());
completer()->setModel(&model);
completer()->setCompletionMode(QCompleter::PopupCompletion);
completer()->setCaseSensitivity(Qt::CaseInsensitive);
connect(this, SIGNAL(textEdited(QString)), this, SLOT(slot_text_edited()));
}
void Completer_line_edit::focusInEvent(QFocusEvent *e) {
QLineEdit::focusInEvent(e);
// force completion when line edit is focued in
completer()->complete();
}
void Completer_line_edit::slot_text_edited() {
qDebug() << "text edited";
// force to show all items when text is empty
completer()->setCompletionMode(text().isEmpty()? QCompleter::UnfilteredPopupCompletion: QCompleter::PopupCompletion);
if (text().isEmpty()) {
// completion list will be hidden now; we will show it again after a delay
timer.singleShot(100, this, SLOT(slot_call_popup()));
}
}
void Completer_line_edit::slot_call_popup() {
// apparently, complete() works only in event handler
QApplication::postEvent(this, new QEvent(QEvent::User));
}
void Completer_line_edit::customEvent(QEvent *e) {
QLineEdit::customEvent(e);
// force completion after text is deleted
completer()->complete();
}
Cuestiones relacionadas
- 1. Diseñar la ventana emergente de un QCompleter en PyQt
- 2. Cómo actualizar el modelo de QCompleter dinámicamente
- 3. ¿Cómo puedo personalizar la ventana emergente QCompleter en PyQt?
- 4. Reglas de finalización de encargo de QCompleter
- 5. Postgresql y comparando con un campo vacío
- 6. ¿Cómo hacer un menú emergente con la barra de desplazamiento?
- 7. Cómo crear un menú emergente con submenú en Java
- 8. QuerySet de campo de texto no vacío
- 9. Icono de la bandeja del sistema con C# Console La aplicación no mostrará el menú
- 10. ¿Cómo puedo agregar un QLineEdit a la barra de menú
- 11. Creación de un cuadro de mensaje emergente con un campo de entrada
- 12. No se puede agregar un nuevo campo a un tipo de contenido, el menú desplegable del widget no funciona
- 13. DataTemplate un ViewModel con un Constructor NO-Vacío?
- 14. ¿Cómo crear un JButton con un menú?
- 15. Creación de un campo de búsqueda QLineEdit para elementos visualizados en un QListView
- 16. cómo representar un campo vacío en yaml
- 17. ¿Cómo configurar el menú emergente para la barra de encabezado ListView junto con el menú emergente de elementos?
- 18. Cómo cambiar el color del menú emergente
- 19. Seleccionar texto de QLineEdit en el foco
- 20. Unión interna solo si un campo no está vacío
- 21. Eliminar el espacio vacío final en un campo contenido
- 22. Mostrando un menú emergente en QGraphicsScene, haga clic o haga clic con el botón derecho
- 23. qlineedit con texto predeterminado para el cual no se debe mover el cursor?
- 24. UITableView editable con un campo de texto en cada celda
- 25. Mostrar un DatePicker con o sin el campo del año
- 26. Establecer el foco en un texto emergente Control de entrada
- 27. QT y elemento de menú personalizado (QLineEdit)
- 28. ¿Cómo mostrar una ventana que actúa como un menú emergente?
- 29. Obtenga el valor del campo con un Cursor
- 30. No hay entrada de teclado si QLineEdit en la ventana emergente sin marco
funciona como un encanto, gracias! Intentaba hacer algo similar con un QTimer :: singleShot, pero por alguna razón no funcionaba. –