首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一旦python类接收到QMessageBox.Information作为参数,样式表调整大小就无法工作

一旦python类接收到QMessageBox.Information作为参数,样式表调整大小就无法工作
EN

Stack Overflow用户
提问于 2021-12-19 13:46:04
回答 1查看 24关注 0票数 0

在python中,我创建了一个类“ScrollMessageBoxShowRC”,它接收三个参数(参见下面):

代码语言:javascript
复制
result = ScrollMessageBoxShowRC(QMessageBox.Information, '', '')

result.exec_()

最初,我实例化了类,仅以"None“作为参数。只要只收到"None",我就可以将类的大小调整为:self.setStyleSheet(“QScrollArea{min-宽度:410 px;最小高度:600 px}”),参见下面:

代码语言:javascript
复制
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大小的样式表似乎不再活跃。我不知道为什么会这样。有人能给我一个提示吗?我可能忽略了什么?

EN

回答 1

Stack Overflow用户

发布于 2021-12-20 02:48:11

QMessageBox是一种特殊类型的QDialog,它在执行时创建自己的布局。在没有参数的情况下创建时,它的行为几乎像一个基本的QDialog,但是一旦添加了元素(最重要的是图标),内部布局就会优先,在某些情况下还会完全删除重新创建的元素。

由于QMessageBox通常是一个方便的简单类,而且这里使用的唯一具体特性似乎是图标,因此根本没有必要使用它。

可以使用基本的QDialog,图标可以使用样式加载,就像QMessageBox一样。然后可以使用QDialogButtonBox添加按钮。

代码语言:javascript
复制
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中。

其他重要说明:

  • 您不应该对按钮使用字符串匹配,特别是如果名称是由库设置的:"OK“在其他系统中可以是不同的字符串(例如,在我的计算机上,"k”是小写);
  • 即使在局部使用本地dlts,实际上也总是在更新self.x,这使得有两个字典并将它们发送到连接函数是没有意义的;
  • 当一个按钮被释放时,就会发出released信号,当用户按下按钮上的鼠标,并在按住鼠标的同时将鼠标移出时,也可能发生这种情况:使用clicked
  • isChecked是一个函数,在实际检查之前,您应该使用if dlt.isChecked():,或者更好的dlts[dlt.objectName()] = dlt.isChecked(),而不是每次将它设置为False
  • stateChanged用于三个可以部分检查的状态复选框;如果只需要一个bool值,则使用toggled
  • 对于直接连接到已知的和特定于这些信号发送者的函数的基本信号(不像线程中那样排队),可以使用self.sender()而不是部分;这样,您也可以直接使用信号参数而不是查询属性;如果您对参数不感兴趣,请在函数签名中忽略它;但是要小心地使用sender()
代码语言:javascript
复制
        # ...
        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()
        # ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70411987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档