在python中,我创建了一个类“ScrollMessageBoxShowRC”,它接收三个参数(参见下面):
result = ScrollMessageBoxShowRC(QMessageBox.Information, '', '')
result.exec_()最初,我实例化了类,仅以"None“作为参数。只要只收到"None",我就可以将类的大小调整为:self.setStyleSheet(“QScrollArea{min-宽度:410 px;最小高度:600 px}”),参见下面:
class ScrollMessageBoxShowRC(QMessageBox):
def __init__(self, *args, **kwargs):
QMessageBox.__init__(self, *args, **kwargs)
self.setWindowTitle("Contacts to view or to delete.")
scroll = QScrollArea(self)
scroll.setWidgetResizable(True)
self.content = QWidget()
scroll.setWidget(self.content)
lay = QVBoxLayout(self.content)
lay.setStyleSheet("min-width: 100px;");
dlts = {}
self.x = {}
for rc in dbaccess.allRC():
dlt = QCheckBox('delete', self)
dlt.stateChanged.connect(partial(self.btnstateDel, dlt, dlts))
dlt.setObjectName(rc[9])
qb = QPushButton(rc[9], self)
qb.released.connect(partial(self.button_releasedRC, rc[9]))
lay.addWidget(qb)
lay.addWidget(dlt)
self.buttonClicked.connect(self.msgButtonClickDel)
self.layout().addWidget(scroll, 0, 0, 1, self.layout().columnCount())
self.setStyleSheet("QScrollArea{min-width:410 px; min-height: 600px}")
def btnstateDel(self, dlt, dlts):
dlts[dlt.objectName()] = False
if dlt.isChecked:
dlts[dlt.objectName()] = True
self.x = dlts
def msgButtonClickDel(self, i):
if i.text() == "OK":
dbaccess.deleteRCs(self.x)
def button_releasedRC(self, nameshow):
pass由于我将参数更改为QMessageBox.Information,“,”设置Widget大小的样式表似乎不再活跃。我不知道为什么会这样。有人能给我一个提示吗?我可能忽略了什么?
发布于 2021-12-20 02:48:11
QMessageBox是一种特殊类型的QDialog,它在执行时创建自己的布局。在没有参数的情况下创建时,它的行为几乎像一个基本的QDialog,但是一旦添加了元素(最重要的是图标),内部布局就会优先,在某些情况下还会完全删除重新创建的元素。
由于QMessageBox通常是一个方便的简单类,而且这里使用的唯一具体特性似乎是图标,因此根本没有必要使用它。
可以使用基本的QDialog,图标可以使用样式加载,就像QMessageBox一样。然后可以使用QDialogButtonBox添加按钮。
class ScrollMessageBoxShowRC(QDialog):
def __init__(self, *args, **kwargs):
QDialog.__init__(self, *args, **kwargs)
layout = QGridLayout(self)
icon = self.style().standardIcon(
QStyle.SP_MessageBoxInformation, None, self)
iconSize = self.style().pixelMetric(
QStyle.PM_MessageBoxIconSize, None, self)
self.iconLabel = QLabel(pixmap=icon.pixmap(iconSize, iconSize))
layout.addWidget(self.iconLabel, 0, 0,
alignment=Qt.AlignLeft|Qt.AlignTop)
self.scroll = QScrollArea()
layout.addWidget(self.scroll, 0, 1)
# ...
self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok)
layout.addWidget(self.buttonBox,
layout.rowCount(), 0, 1, layout.columnCount())
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)
def accept(self):
dbaccess.deleteRCs(self.x)
super().accept()QMessageBox的图标列在枚举 of QStyle中。
其他重要说明:
dlts,实际上也总是在更新self.x,这使得有两个字典并将它们发送到连接函数是没有意义的;released信号,当用户按下按钮上的鼠标,并在按住鼠标的同时将鼠标移出时,也可能发生这种情况:使用clicked;isChecked是一个函数,在实际检查之前,您应该使用if dlt.isChecked():,或者更好的dlts[dlt.objectName()] = dlt.isChecked(),而不是每次将它设置为False;stateChanged用于三个可以部分检查的状态复选框;如果只需要一个bool值,则使用toggled;self.sender()而不是部分;这样,您也可以直接使用信号参数而不是查询属性;如果您对参数不感兴趣,请在函数签名中忽略它;但是要小心地使用sender(); # ...
self.dlts = {}
for rc in dbaccess.allRC():
dlt = QCheckBox('delete', self)
dlt.toggled.connect(self.btnstateDel)
dlt.setObjectName(rc[9])
qb = QPushButton(rc[9], self)
qb.clicked.connect(self.button_releasedRC)
lay.addWidget(qb)
lay.addWidget(dlt)
def btnstateDel(self, checked):
self.dlts[self.sender().objectName()] = checked
def button_releasedRC(self):
nameshow = self.sender()
# ...https://stackoverflow.com/questions/70411987
复制相似问题