cuốn sách gpt4 ai đã làm

PyQt: Bố cục bao quanh các tiện ích bên trong QScrollArea

In lại Tác giả: Walker 123 Thời gian cập nhật: 27-11-2023 23:11:56 25 4
mua khóa gpt4 Nike

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:

hình ảnh ví dụ của tôi mà tôi không thích

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):

nhập mô tả hình ảnh ở đây

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.

câu trả lời hay nhất

Đâ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_())

Về cách bố trí bao quanh các tiện ích trong python - PyQt:QScrollArea, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/58473405/

25 4 0
Walker 123
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress