2011-12-02 18 views
6

Me gustaría crear un campo de texto de tipo búsqueda en QT que pueda contener tanto texto estándar como lo que yo llamaría "etiquetas" ... básicamente términos de búsqueda adicionales que se resaltan y separan individualmente . Imagino que se parece a la selección múltiple en "Elegido" (biblioteca Javascript). http://harvesthq.github.com/chosen/QT - multi-select

No he podido encontrar nada similar mediante la búsqueda. También parece que los tipos estándar de cuadros de texto QT no están diseñados para tener "sub-widgets".

Parece que QTextEdit admite HTML ... que podría ser una posibilidad ... pero los documentos no son muy claros para mí ya que son compatibles con CSS (que creo que sería necesario para obtener el formato deseado)) http://doc.qt.io/qt-5/qtextedit.html#html-prop

Es curioso ... Llegué al final de esta página de envío y me di cuenta de que tenía que etiquetar esto (esta es mi primera pregunta) ... ¡Este cuadro de etiquetas es casi exactamente lo que quiero!

+0

Acerca de css-compatibility: http://developer.qt.nokia.com/doc/qt-4.8/richtext-html-subset.html. Podría tratar de emular el comportamiento deseado con tablas y algunos css-magic, aunque no será fácil ya que richtext no admite componentes de entrada (botones "eliminar etiqueta"). Debe proporcionar más información sobre el comportamiento deseado para obtener una respuesta más exacta. ¿Se supone que cada palabra está "etiquetada" o es texto con pocas etiquetas? ¿Se supone que las palabras etiquetadas siguen siendo editables o simplemente extraíbles? Si tengo un momento, intentaré crear algo como lo que necesitas. –

Respuesta

1

Aquí es una aplicación muy sencilla de poner botones en un QLineEdit como un usuario escribe, escrito en Python:

from PySide.QtCore import * 
from PySide.QtGui import * 

class Entry(QLineEdit): 

    def __init__(self): 
     QLineEdit.__init__(self) 
     self.buttons = [] 
     self.backupText = '' 
     self.textEdited.connect(self.on_change) 
     self.layout = QHBoxLayout() 
     self.setLayout(self.layout) 
     self.layout.addStretch() 
     marginz = QLabel(' ') 
     marginz.show() 
     margin = marginz.width() 
     marginz.hide() 
     self.layout.setContentsMargins(margin, margin, margin, margin) 

    def on_change(self): 
     if self.text()[-1] == ' ' and not self.text().endswith(' '): 
      if len(self.text()) > len(self.backupText): 
       self.setText(self.text() + ' ') 
       self.buttons.append(QPushButton(self.text().split()[-1])) 
       self.layout.insertWidget(self.layout.count()-1, self.buttons[-1]) 
      else: 
       self.setText(self.text()[0:-1]) 
       self.buttons[-1].hide() 
       del self.buttons[-1] 
     self.backupText = self.text() 


app = QApplication([]) 

window = QMainWindow() 
window.setStyleSheet(
    'QPushButton {border: 1px solid gray; background: lightgray; color: black;}') 
entry = Entry() 
window.setCentralWidget(entry) 
window.show() 

app.exec_() 

crea una QHBoxLayout y añade un botón para que por cada palabra que escribe, y toma el botón de distancia cuando te deshaces de la palabra.

Si desea poner un botón de cerrar dentro de cada sub-widgets, puede hacer un widget personalizado para eso también.

EDITAR

Como se indica el comentario de j_kubik, los sistemas con botones en todo el margen haría que los botones de etiqueta para solapar el texto que un usuario está escribiendo actualmente. Modifiqué el código para aplicar los márgenes de los botones insertados (con hojas de estilo), agregué un espacio adicional para cada espacio que el usuario escribe y configuré los contenidosMargins de QHBoxLayout para que tengan el mismo ancho que un espacio (""). Ahora los botones no se superpondrán al texto insertado.

+1

¿Cómo se alinea correctamente? Quiero decir que esos botones serán más anchos que el texto, ¿no se superpondrán a la siguiente palabra escrita? sería bueno ver lo que se escribe.Creo que para que se vea bien y ser portátil entre diferentes sistemas y estilos usados, realmente debería hacerse utilizando html o reescribir desde cero utilizando widgets de C++/python y botones. –

+0

Debería haber mencionado en la pregunta - Estoy usando C++ ... Voy a tratar de convertir su respuesta a C++ y ver lo que obtengo. Gracias por el código. –

1

No hay soultion listo para usar que yo sepa. Si tuviera que intentar implementarlo, definitivamente usaría widget con diseño, en el cual hay dos tipos de widgets secundarios: LineEdits (sin bordes para que parezca parte real del widget más grande) y botones; nuevos botones antes o después y si es necesario, divididos en dos con botón. De esta manera, no interfiere con las intenciones de los programadores de qt sobre cómo usar widgets y cómo hacer que todos encajen en un solo estilo.

Si lo desea, puede utilizar widgets personalizados en lugar de botones para proporcionar el icono de quitar. Como escribí en mi comentario, si tengo un poco más de tiempo intentaré hacer algo así yo mismo.

Cuestiones relacionadas