Tôi đang phát triển một ứng dụng sử dụng PyQt4 để ghi nhớ văn bản. Tôi muốn hiển thị tất cả các từ trong bong bóng để bạn có thể thấy độ dài của các từ. Nhưng khi tôi QScrollKhu vực
Khi có đủ các bong bóng trong bong bóng, chúng sẽ xếp thẳng hàng lần lượt. Tôi muốn chúng sắp xếp cạnh nhau nhưng tự động bọc lại.
Tôi sử dụng cái có viền tròn Nhãn Q
Hãy để bong bóng làm công việc của họ. nhưng bây giờ tôi của QLabel
Với các từ trong , PyQt không coi chúng là từ - mà là vật dụng. Vì vậy, PyQt đặt một tiện ích bên dưới một tiện ích khác. Tôi muốn các vật dụng sắp xếp cạnh nhau cho đến khi chúng đến cuối hàng, sau đó chúng sẽ quấn quanh hàng tiếp theo - nghĩa là của QLabel
Tài liệu phải giống như các từ trong văn bản.
Đây là mã của tôi cho đến nay:
f = open(r'myFile.txt')
Bong bóng lớp (QtGui.QLabel):
def __init__(tự, văn bản):
siêu(Bong bóng, tự).__init__(văn bản)
self.word = văn bản
self.setContentsMargins(5, 5, 5, 5)
def PaintEvent(self, e):
p = QtGui.QPainter(tự)
p.setRenderHint(QtGui.QPainter.Antialiasing,True)
p.drawRoundedRect(0,0,self.width()-1,self.height()-1,5,5)
super(Bubble, self).paintEvent(e)
lớp MainWindow(QtGui.QMainWindow):
def __init__(self, text, parent=None):
QtGui.QMainWindow.__init__(bản thân, cha mẹ)
self.setupUi(tự)
self.MainArea = QtGui.QScrollArea
self.widget = QtGui.QWidget()
vbox = QtGui.QVBoxLayout()
self.words = []
cho t trong re.findall(r'\b\w+\b', văn bản):
nhãn = Bong bóng(t)
label.setFont(QtGui.QFont('SblHebrew', 18))
label.setFixedWidth(label.sizeHint().width())
self.words.append(nhãn)
vbox.addWidget(nhãn)
self.widget.setLayout(vbox)
self.MainArea.setWidget(self.widget)
nếu __name__ == '__main__':
hệ thống nhập khẩu
ứng dụng = QtGui.QApplication(sys.argv)
myWindow = MainWindow(f.read(), None)
myWindow.show()
sys.exit(app.exec_())
Khi tôi chạy nó, tôi nhận được:
Nhưng tôi muốn từ (chứa từnhãn Q
) cạnh nhau, không phải ở dưới nhau, như thế này (thao tác ảnh):
Tôi đã thực hiện rất nhiều nghiên cứu nhưng không có câu trả lời nào có thể giúp tôi sắp xếp các vật dụng với nhau.
Đây là phiên bản PyQt5 của tập lệnh demo bố cục luồng:
hệ thống nhập khẩu
từ PyQt5 nhập QtCore, QtGui, QtWidgets
lớp FlowLayout(QtWidgets.QLayout):
def __init__(self, parent=Không, lề=-1, hspacing=-1, vspacing=-1):
super(FlowLayout, self).__init__(parent)
self._hspaces = hspacing
self._vspaces = vspacing
self._items = []
self.setContentsMargins(lề, lề, lề, lề)
chắc chắn __del__(tự):
del self._items[:]
def addItem(self, item):
self._items.append(item)
def ngangSpacing(self):
nếu self._hspaces >= 0:
tự trả về._hspaces
khác:
trả về self.smartSpacing(
QtWidgets.QStyle.PM_LayoutHorizontalSpacing)
def dọcSpacing(self):
nếu self._vspaces >= 0:
trả về self._vspaces
khác:
trả về self.smartSpacing(
QtWidgets.QStyle.PM_LayoutVerticalSpacing)
số def (tự):
trả về len(self._items)
def itemAt(tự, chỉ mục):
if 0 <= chỉ mục < len(self._items):
trả về self._items[index]
def takeAt(tự, chỉ mục):
if 0 <= chỉ mục < len(self._items):
trả về self._items.pop(index)
def mở rộngDirections(self):
trả về QtCore.Qt.Orientations(0)
def hasHeightForWidth(self):
trả về Đúng
def chiều caoForWidth(tự, chiều rộng):
trả về self.doLayout(QtCore.QRect(0, 0, width, 0), True)
def setGeometry(self, ect):
super(FlowLayout, self).setGeometry(orth)
self.doLayout(trực tràng, sai)
kích thước defHint(tự):
trả về self.minimumSize()
def tối thiểuSize(self):
kích thước = QtCore.QSize()
cho mục trong self._items:
kích thước = size.expandedTo(item.minimumSize())
trái, trên, phải, dưới = self.getContentsMargins()
kích thước += QtCore.QSize(trái + phải, trên + dưới)
kích thước trả lại
def doLayout(self, orth, testonly):
trái, trên, phải, dưới = self.getContentsMargins()
hiệu quả = orth. adjustment(+left, +top, -right, -bottom)
x = hiệu quả.x()
y = hiệu quả.y()
chiều cao dòng = 0
cho mục trong self._items:
widget = item.widget()
hspace = self.horizontalSpacing()
nếu hspace == -1:
hspace = widget.style().layoutSpacing(
QtWidgets.QSizePolicy.PushButton,
QtWidgets.QSizePolicy.PushButton, QtCore.Qt.Horizontal)
vspace = self.verticalSpacing()
nếu vspace == -1:
vspace = widget.style().layoutSpacing(
QtWidgets.QSizePolicy.PushButton,
QtWidgets.QSizePolicy.PushButton, QtCore.Qt.Vertical)
nextX = x + item.sizeHint().width() + hspace
nếu nextX - hspace > hiệu quả.right() và chiều cao dòng > 0:
x = hiệu quả.x()
y = y + lineheight + vspace
nextX = x + item.sizeHint().width() + hspace
chiều cao dòng = 0
nếu không chỉ thử nghiệm:
item.setGeometry(
QtCore.QRect(QtCore.QPoint(x, y), item.sizeHint()))
x = tiếp theoX
lineheight = max(lineheight, item.sizeHint().height())
trả về y + chiều cao dòng - orth.y() + đáy
def smartSpacing(self, pm):
cha mẹ = self.parent()
nếu cha mẹ là Không có:
trở lại -1
Elif parent.isWidgetType():
return parent.style().pixelMetric(pm, None, parent)
khác:
trả về parent.spacing()
Bong bóng lớp (QtWidgets.QLabel):
def __init__(tự, văn bản):
siêu(Bong bóng, tự).__init__(văn bản)
self.word = văn bản
self.setContentsMargins(5, 5, 5, 5)
def PaintEvent(tự, sự kiện):
họa sĩ = QtGui.QPainter(self)
Painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
họa sĩ.drawRoundedRect(
0, 0, self.width() - 1, self.height() - 1, 5, 5)
super(Bubble, self).paintEvent(event)
lớp MainWindow(QtWidgets.QMainWindow):
def __init__(self, text, parent=None):
super(MainWindow, self).__init__(parent)
self.mainArea = QtWidgets.QScrollArea(self)
self.mainArea.setWidgetResizable(True)
widget = QtWidgets.QWidget(self.mainArea)
widget.setMinimumWidth(50)
bố cục = FlowLayout(widget)
self.words = []
cho từ trong text.split():
nhãn = Bong bóng(từ)
label.setFont(QtGui.QFont('SblHebrew', 18))
label.setFixedWidth(label.sizeHint().width())
self.words.append(nhãn)
bố cục.addWidget(nhãn)
self.mainArea.setWidget(widget)
self.setCentralWidget(self.mainArea)
nếu __name__ == '__main__':
ứng dụng = QtWidgets.QApplication(sys.argv)
window = MainWindow('Harry Potter là một bộ truyện văn học giả tưởng')
window.show()
sys.exit(app.exec_())
Tôi là một lập trình viên xuất sắc, rất giỏi!