更改新小部件的大小
Posted
技术标签:
【中文标题】更改新小部件的大小【英文标题】:changing the size of a new widgets 【发布时间】:2016-11-19 08:48:44 【问题描述】:我正在使用 pyQT creator 和 python 开发 GUI。它是一个聊天应用程序,它使用绘制的矩形来使用 Qpainter 保存聊天文本。所有绘制的小部件都显示在 scrollArea 中(在 verticalLayout 内)。
到目前为止,GUI 正在运行,您可以在以下代码中看到:
from PyQt5 import QtCore, QtGui, QtWidgets
class Bot_Bubble(QtWidgets.QLabel):
def __init__(self,text):
super(Bot_Bubble,self).__init__(text)
self.setContentsMargins(5,5,5,5)
def paintEvent(self, e):
p = QtGui.QPainter(self)
p.setRenderHint(QtGui.QPainter.Antialiasing,True)
p.fillRect(self.rect(), QtGui.QColor("#F0F8FF"))
p.drawRoundedRect(self.rect(), 3.0, 3.0)
super(Bot_Bubble,self).paintEvent(e)
class Ui_chatbotgui(object):
def setupUi(self, chatbotgui):
chatbotgui.setObjectName("chatbotgui")
chatbotgui.resize(361, 566)
chatbotgui.setStyleSheet("background-color:rgba(0, 0, 0, 0)")
self.gridLayout = QtWidgets.QGridLayout(chatbotgui)
self.gridLayout.setContentsMargins(11, 11, 11, 11)
self.gridLayout.setSpacing(6)
self.gridLayout.setObjectName("gridLayout")
self.scrollArea = QtWidgets.QScrollArea(chatbotgui)
self.scrollArea.setLayoutDirection(QtCore.Qt.RightToLeft)
self.scrollArea.setStyleSheet("background-color: rgb(255, 255, 255);\n""border-style: solid;\n""border-color: white;\n""border-width: 3px;\n""border-radius: 10px;")
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.verticalLayout_2 =QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents)
self.verticalLayout_2.setContentsMargins(11, 11, 11, 11)
self.verticalLayout_2.setSpacing(6)
self.verticalLayout_2.setDirection(QtWidgets.QVBoxLayout.TopToBottom)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.verticalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.gridLayout.addWidget(self.scrollArea, 0, 0, 1, 1)
self.lineEdit = QtWidgets.QLineEdit(chatbotgui)
self.lineEdit.setEnabled(True)
self.lineEdit.setLayoutDirection(QtCore.Qt.RightToLeft)
self.lineEdit.setAutoFillBackground(False)
self.lineEdit.setStyleSheet("background-color: rgb(255, 255, 255);\n""border-style: solid;\n""border-color: white;\n""border-width: 3px;\n""border-radius: 10px;")
self.lineEdit.setObjectName("lineEdit")
self.gridLayout.addWidget(self.lineEdit, 1, 0, 1, 1)
self.lineEdit.returnPressed.connect(self.showtext)
self.retranslateUi(chatbotgui)
QtCore.QMetaObject.connectSlotsByName(chatbotgui)
self.scrollArea.raise_()
def retranslateUi(self, chatbotgui):
_translate = QtCore.QCoreApplication.translate
chatbotgui.setWindowTitle(_translate("chatbotgui", "المساعد الذكي"))
def showtext(self):
text = self.lineEdit.text()
label = Bot_Bubble(text)
self.verticalLayout_2.addWidget(label)
self.verticalLayout_2.addStretch()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
chatbotgui = QtWidgets.QWidget()
ui = Ui_chatbotgui()
ui.setupUi(chatbotgui)
chatbotgui.show()
sys.exit(app.exec_())
但是我在绘制的小部件的宽度上遇到了一些问题,它需要与垂直布局相同的宽度(我想要与用户文本的宽度相同)?!
谢谢你,
【问题讨论】:
【参考方案1】:您可以使用setSizePolicy
和QSizePolicy
来更改小部件在布局内占用的空间,在您的情况下:
# in showtext() method
label.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
【讨论】:
以上是关于更改新小部件的大小的主要内容,如果未能解决你的问题,请参考以下文章