2011-12-02 42 views
6

Tôi muốn tạo trường văn bản kiểu tìm kiếm trong QT có thể chứa cả văn bản chuẩn cũng như những gì tôi gọi là "thẻ" ... về cơ bản các cụm từ tìm kiếm bổ sung được đánh dấu riêng và tách biệt . Tôi hình dung điều này giống như đa lựa chọn trong "Chọn" (thư viện Javascript). http://harvesthq.github.com/chosen/QT - đa lựa chọn

Tôi không thể tìm thấy bất kỳ điều gì tương tự thông qua tìm kiếm. Dường như các loại hộp văn bản QT tiêu chuẩn không được thiết kế để có "các widget con". Có vẻ như QTextEdit hỗ trợ HTML ... có thể là một khả năng ... nhưng các tài liệu không rõ ràng với tôi như những gì được hỗ trợ về CSS (mà tôi nghĩ rằng sẽ được yêu cầu để có được định dạng mong muốn). http://doc.qt.io/qt-5/qtextedit.html#html-prop

Buồn cười ... Tôi đã đến cuối trang gửi này và nhận ra tôi phải gắn thẻ thẻ này (đây là câu hỏi SO đầu tiên của tôi) ... Hộp trình thêm thẻ này gần như chính xác những gì tôi muốn!

+0

Giới thiệu về khả năng tương thích css: http://developer.qt.nokia.com/doc/qt-4.8/richtext-html-subset.html. Bạn có thể thử mô phỏng hành vi mong muốn với các bảng và một số css-magic, mặc dù nó sẽ không dễ dàng vì richtext không hỗ trợ bất kỳ thành phần đầu vào nào (các nút 'remove tag'). Bạn nên cung cấp thêm thông tin về hành vi mong muốn để có được câu trả lời chính xác hơn. Mỗi từ được cho là "được gắn thẻ" hay là văn bản có ít thẻ trong đó? Các từ được gắn thẻ có phải vẫn có thể chỉnh sửa hoặc chỉ có thể di chuyển được không? Nếu tôi có một chút thời gian, tôi sẽ cố gắng tạo ra thứ gì đó như bạn cần. –

Trả lời

1

Đây là một thực hiện rất đơn giản đưa nút trong một QLineEdit như một loại người sử dụng, được viết bằng 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_() 

Nó tạo ra một QHBoxLayout và thêm một nút để nó cho mỗi từ bạn gõ, và mất nút đi khi bạn thoát khỏi từ.

Nếu bạn muốn đặt nút đóng bên trong mỗi tiện ích phụ, bạn cũng có thể tạo tiện ích tùy chỉnh cho tiện ích con đó.

EDIT

Theo bình luận của j_kubik tuyên bố, hệ thống với các nút rộng biên độ sẽ gây ra các nút thẻ để chồng lên văn bản người dùng hiện đang gõ. Tôi đã sửa đổi mã để thực thi lề của các nút được chèn (với bảng định kiểu), thêm khoảng trống cho mỗi không gian người dùng nhập và đặt nội dung của QHBoxLayoutMargins có cùng chiều rộng với khoảng trắng (""). Bây giờ các nút sẽ không chồng chéo văn bản được chèn vào.

+1

Làm cách nào nó được căn chỉnh chính xác? Tôi có nghĩa là các nút đó sẽ rộng hơn chỉ là văn bản, chúng sẽ không chồng chéo từ được gõ tiếp theo? sẽ rất tuyệt khi xem nội dung đang được viết.Tôi nghĩ rằng để làm cho nó trông tốt và được di chuyển giữa các hệ thống khác nhau và sử dụng phong cách nó thực sự sohuld được thực hiện bằng cách sử dụng html hoặc rewriten từ đầu bằng cách sử dụng c + +/python và nút widget. –

+0

Tôi nên có đề cập trong câu hỏi - Tôi đang sử dụng C + + ... Tôi sẽ cố gắng để chuyển đổi câu trả lời của bạn để C + + và xem những gì tôi nhận được. Cảm ơn mã. –

1

Không có linh hồn sẵn sàng để sử dụng mà tôi biết. Nếu tôi cố gắng triển khai nó, tôi chắc chắn sẽ sử dụng widget với bố cục, trong đó có hai loại widget con: LineEdits (không viền trông giống như phần thực tế của widget lớn hơn) và các nút - nút mới trước hoặc sau và nếu chia tách linedit thành tw với nút giữa. Bằng cách này không can thiệp vào ý định của các lập trình viên qt về cách sử dụng các tiện ích và cách làm cho chúng phù hợp với nhau theo một phong cách.

Nếu bạn muốn, bạn có thể sử dụng tiện ích tùy chỉnh thay vì các nút để cung cấp biểu tượng xóa. Như tôi đã viết trong bình luận của tôi - nếu tôi có thêm một chút thời gian, tôi sẽ cố gắng làm một cái gì đó giống như bản thân mình.

Các vấn đề liên quan