【问题标题】:How to inherit from QWidget in PyQt?如何从 PyQt 中的 QWidget 继承?
【发布时间】:2013-10-21 11:58:31
【问题描述】:

我无法使用 PyQt 4 从 QWidget 继承:

from PyQt4.QtGui import QApplication, QMainWindow, QWidget

class MyWidget(QWidget):
    pass

if __name__ == "__main__":
    app = QApplication([])
    window = QMainWindow()
    window.resize(200, 200)
    widget1 = MyWidget(window)
    widget1.resize(100, 100)
    widget1.setStyleSheet("background-color:#FFFFFF")
    window.show()
    app.exec_()

它不起作用。我只是看不到小部件。但是,使用 QLabel 代替 QWidget 是可行的。

谢谢。

解决方案

重新实现paintEvent:

class MyWidget(QWidget):
    def paintEvent(self, event):
        o = QStyleOption()
        o.initFrom(self)
        p = QPainter(self)
        self.style().drawPrimitive(QStyle.PE_Widget, o, p, self)  

【问题讨论】:

  • 你的意思是它不起作用?有错误吗?窗口不出现吗?您需要更具描述性。
  • 小部件没有出现在窗口内。
  • 你能附上不同的截图吗?根据您的代码,虽然您声明了 DnDWidget 的父级,但实际上并没有将它放在窗口内,所以我希望它不会显示出来。
  • 这是上面代码的预览:link。如果我从 QLabel 继承,这是预览:link

标签: python-2.7 pyqt qwidget


【解决方案1】:

您的子类化正确。 “问题”只是 QWidget 与主窗口具有相同的背景颜色(您对 setStyleSheet 的调用不起作用)。

作为证据,从终端运行此代码:

from PyQt4.QtGui import QApplication, QMainWindow, QWidget, QLabel

class MyWidget(QWidget):
     def enterEvent(self, evt):
        print 'a'

if __name__ == "__main__":
    app = QApplication([])
    window = QMainWindow()
    window.resize(200, 200)
    widget1 = MyWidget(window)
    widget1.resize(100, 100)
    widget1.setStyleSheet("background-color:#FFFFFF")
    window.show()
    app.exec_()

当您将鼠标移动到第一个 100,100 像素的正方形时,您会看到终端中打印出字母“a”

【讨论】:

  • 使用此代码时,将样式表更改为任何颜色都不起作用
  • 知道为什么调用 setStyleSheet 不起作用吗?我遇到了同样的问题,我假设 MyWidget 在继承自 QWidget 并且不覆盖任何方法时的行为应该与 QWidget 完全相同。
猜你喜欢
  • 2019-11-14
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 2012-03-02
相关资源
最近更新 更多