gpt4 book ai didi

python - Pyqt5 - 网格布局行为不当

转载 作者:行者123 更新时间:2023-12-01 03:19:21 26 4
gpt4 key购买 nike

所以我试图掌握 Qt(更具体地说,Pyqt),并且我想创建一个简单的反馈表单。应该有

  • 标题
  • 姓名(“作者”)
  • 一条消息
  • 发送和取消按钮

首先让我们尝试不使用按钮(App 类仅提供一个用于创建弹出窗口的按钮。问题涉及其下面的 Form 类):

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QDesktopWidget,\
QHBoxLayout, QVBoxLayout, QGridLayout,\
QPushButton, QLabel,QLineEdit, QTextEdit,\
qApp
from PyQt5.QtGui import QIcon


class App(QMainWindow):

def __init__(self):
super().__init__()
self.title = 'PyQt5 Layout Demo'
self.popup = None

self.initUI()

def initUI(self):
self.setWindowTitle(self.title)
self.setWindowIcon(QIcon('imgs/python3.png'))

formButton = QPushButton("show form")
formButton.clicked.connect(self.showPopup)

formBox = QHBoxLayout()
formBox.addWidget(formButton)
formBox.addStretch(1)

vbox = QVBoxLayout()
vbox.addLayout(formBox)
vbox.addStretch(1)

# self.setLayout(vbox) # would work if this was a QWidget

# instead, define new central widget
window = QWidget()
window.setLayout(vbox)
self.setCentralWidget(window)

self.center(self)
self.show()

@staticmethod
def center(w: QWidget):
qr = w.frameGeometry() # get a rectangle for the entire window

# center point = center of screen resolution
cp = QDesktopWidget().availableGeometry().center()

qr.moveCenter(cp) # move center of rectangle to cp
w.move(qr.topLeft()) # move top-left point of window to top-let point of rectangle

def showPopup(self):
if self.popup is None:
self.popup = Form(self)
self.popup.setGeometry(10, 10, 300, 400)
self.center(self.popup)

self.popup.show()


class Form(QWidget):
def __init__(self, main):
super().__init__()
self.initUI()
self.main = main

def initUI(self):
self.setWindowTitle('Feedback')
self.setWindowIcon(QIcon('imgs/python3.png'))

title = QLabel('Title')
author = QLabel('Author')
message = QLabel('Message')

titleEdit = QLineEdit()
authorEdit = QLineEdit()
messageEdit = QTextEdit()

grid = QGridLayout()
grid.setSpacing(10)

grid.addWidget(title, 1, 0)
grid.addWidget(titleEdit,1, 1)

grid.addWidget(author, 2, 0)
grid.addWidget(authorEdit,2, 1)

grid.addWidget(message, 3, 0)
grid.addWidget(messageEdit, 4, 0, 6, 0)

self.setLayout(grid)

# probably should delegate to self.main, but bear with me
def send(self):
self.main.popup = None
self.hide()

def cancel(self):
self.hide()

if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())

enter image description here

好的,看起来不错。行编辑和文本编辑之间的间距有点太大,但由于我想在其下方添加一些按钮,这应该是一个问题。

所以我补充一下:

    sendBtn = QPushButton("send")
cancelBtn = QPushButton("cancel")

sendBtn.clicked.connect(self.send)
cancelBtn.clicked.connect(self.cancel)

grid.addWidget(sendBtn, 7, 1)
grid.addWidget(cancelBtn, 7, 2)

产生

enter image description here

现在显然,我忘记将标题和作者行编辑延伸到新引入的第 2 列。很容易修复,但真正困扰我的是按钮的位置。

为什么它们出现在文本编辑的中间?我可以看到 Qt 如何选择列大小,以及为什么这会导致按钮大小不同,但由于本教程实际上并未向表单添加按钮,所以我不知道如何解决这个问题。

当然,我可以简单地添加框:

sendBtn = QPushButton("send")
cancelBtn = QPushButton("cancel")

sendBtn.clicked.connect(self.send)
cancelBtn.clicked.connect(self.cancel)

btns = QHBoxLayout()
btns.addStretch(1)
btns.addWidget(sendBtn)
btns.addWidget(cancelBtn)

l = QVBoxLayout()
l.addLayout(grid)
l.addLayout(btns)

self.setLayout(l)

这样,弹出窗口实际上开始看起来更接近可接受的内容:

enter image description here

但是有没有办法在网格布局中解决这个问题?

最佳答案

您似乎误解了 addWidget 的签名。第二个和第三个参数指定小部件所在的行和列,而第三个和第四个参数指定行跨度和列跨度。

在您的示例中,问题从这里开始:

    grid.addWidget(message, 3, 0)
grid.addWidget(messageEdit, 4, 0, 6, 0)

您在其中进行文本编辑跨越六行和零列 - 我怀疑这是否是您的意图。相反,您可能想要这个:

    grid.addWidget(message, 3, 0, 1, 2)
grid.addWidget(messageEdit, 4, 0, 1, 2)

这将使消息标签和文本编辑跨越由上面的标题和作者字段创建的两列。

现在,当您添加按钮时,它们必须有自己的布局,因为顶部两行已经确定了两列的宽度。如果将按钮直接添加到网格中,它们将被迫具有与顶部两行中的小部件相同的宽度(反之亦然)。所以按钮应该像这样添加:

    hbox = QHBoxLayout()

sendBtn = QPushButton("send")
cancelBtn = QPushButton("cancel")

sendBtn.clicked.connect(self.send)
cancelBtn.clicked.connect(self.cancel)

hbox.addStretch()
hbox.addWidget(sendBtn)
hbox.addWidget(cancelBtn)

grid.addLayout(hbox, 5, 0, 1, 2)

关于python - Pyqt5 - 网格布局行为不当,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42088104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com