【问题标题】:PyQt: setCentralWidget clashes with QPushButton functionPyQt:setCentralWidget 与 QPushButton 功能冲突
【发布时间】:2017-09-20 14:47:28
【问题描述】:

所以我从我的项目中推断出这个问题,我在主窗口类中注入的 Slides Widget 类中的 setCentralWidget 导致主窗口中的按钮功能(即打开一个新的 Widget 窗口)无法正常工作全部。

如果我删除 setCentralWidget 按钮可以正常工作,因此不会影响任何功能,我应该使用什么方法?我应该使用其他形式调用 Slides Widget 类吗?

一如既往地感谢任何帮助!谢谢!

from PyQt4 import QtCore, QtGui
import sys
from functools import partial


class MainWindow(QtGui.QMainWindow):
    def __init__(self, image_files, parent=None):
        super(MainWindow, self).__init__()

        self.setupUi(self)
        self.slides_widget = Slides(image_files, self)
#If you enable this down below, pushButton will not function 
#and instead the slideshow will pop up and function correctly
        #self.setCentralWidget(self.slides_widget)

    def setupUi(self, MainWindow):

        MainWindow.resize(1278, 688)
        #MainWindow.setStyleSheet(self.styledata)

        self.groupBox = QtGui.QGroupBox(MainWindow)
        self.groupBox.setGeometry(QtCore.QRect(490, 220, 120, 371))
        self.groupBox.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop)
        self.groupBox.setFlat(False)
        self.groupBox.setCheckable(False)


        self.pushButton_Desc = QtGui.QPushButton(self.groupBox)
        self.pushButton_Desc.setGeometry(QtCore.QRect(20, 30, 71, 61))

        self.pushButton_Desc.clicked.connect(partial(self.DescWindow))

        self.groupBox.raise_()

        self.NewWindow = QtGui.QWidget()

    def DescWindow(self):
        self.NewWindow.show();


class Slides(QtGui.QWidget):
    def __init__(self, image_files, parent=None):
        super(Slides, self).__init__(parent)

        self.image_files = image_files
        self.label = QtGui.QLabel("", self)
        self.label.setGeometry(65, 225, 423, 363)

        #buttons to rewind and forward
        self.button = QtGui.QPushButton(". . .", self)
        self.button.setGeometry(200, 100, 140, 30)
        self.button.clicked.connect(self.timerEvent)

        self.timer = QtCore.QBasicTimer()
        self.step = 0
        self.delay = 3000 #ms

    def timerEvent(self, e=None):
        if self.step >= len(self.image_files):
            self.timer.start(self.delay, self)
            self.step = 0
            return
        self.timer.start(self.delay, self)
        file = self.image_files[self.step]
        image = QtGui.QPixmap(file)
        self.label.setPixmap(image)
        #self.setWindowTitle("{} --> {}".format(str(self.step), file))
        self.step += 1


image_files = ["images\slide1.jpg", "images\slide2.jpg", "images\slide3.jpg",
 "images\slide4.jpg", "images\slide5.jpg"]

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    Form = MainWindow(image_files)
    Form.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt pyqt4 qwidget qpushbutton


    【解决方案1】:

    问题的出现是因为先放置按钮,然后在上面放置了CentralWidget,解决方法是将按钮放置在CentralWidget中,即Slides中。

    你必须改变:

    def __init__(self, image_files, parent=None):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.slides_widget = Slides(image_files, self)
    

    到:

    def __init__(self, image_files, parent=None):
        super(MainWindow, self).__init__()
        self.slides_widget = Slides(image_files, self)
        self.setupUi(self)
    

    self.groupBox = QtGui.QGroupBox(MainWindow)
    

    到:

    self.groupBox = QtGui.QGroupBox(MainWindow.slides_widget)
    

    完整代码:

    from PyQt4 import QtCore, QtGui
    import sys
    
    
    class MainWindow(QtGui.QMainWindow):
        def __init__(self, image_files, parent=None):
            super(MainWindow, self).__init__()
            self.slides_widget = Slides(image_files, self)
            self.setupUi(self)
    
        def setupUi(self, MainWindow):
    
            MainWindow.resize(1278, 688)
            #MainWindow.setStyleSheet(self.styledata)
    
            self.groupBox = QtGui.QGroupBox(MainWindow.slides_widget)
            self.groupBox.setGeometry(QtCore.QRect(490, 220, 120, 371))
            self.groupBox.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop)
            self.groupBox.setFlat(False)
            self.groupBox.setCheckable(False)
    
    
            self.pushButton_Desc = QtGui.QPushButton(self.groupBox)
            self.pushButton_Desc.setGeometry(QtCore.QRect(20, 30, 71, 61))
    
            self.pushButton_Desc.clicked.connect(self.DescWindow)
            self.setCentralWidget(self.slides_widget)
    
            self.groupBox.raise_()
    
            self.NewWindow = QtGui.QWidget()
    
        def DescWindow(self):
            self.NewWindow.show();
    
    
    class Slides(QtGui.QWidget):
        def __init__(self, image_files, parent=None):
            super(Slides, self).__init__(parent)
    
            self.image_files = image_files
            self.label = QtGui.QLabel("", self)
            self.label.setGeometry(65, 225, 423, 363)
    
            #buttons to rewind and forward
            self.button = QtGui.QPushButton(". . .", self)
            self.button.setGeometry(200, 100, 140, 30)
            self.button.clicked.connect(self.timerEvent)
    
            self.timer = QtCore.QBasicTimer()
            self.step = 0
            self.delay = 3000 #ms
    
        def timerEvent(self, e=None):
            if self.step >= len(self.image_files):
                self.timer.start(self.delay, self)
                self.step = 0
                return
            self.timer.start(self.delay, self)
            file = self.image_files[self.step]
            image = QtGui.QPixmap(file)
            self.label.setPixmap(image)
            #self.setWindowTitle("{} --> {}".format(str(self.step), file))
            self.step += 1
    
    
    image_files = ["images\slide1.jpg", "images\slide2.jpg", "images\slide3.jpg",
     "images\slide4.jpg", "images\slide5.jpg"]
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        Form = MainWindow(image_files)
        Form.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 我必须在按钮下方找到那个鬼鬼祟祟的self.setCentralWidget(self.slides_widget),哈哈,我成功了!干杯!但是我意识到,当我为在 MainWindow 中调用的 Slides 放置一个框架时,它会与图像重叠......关于我如何在图像后面调用框架的任何想法? self.SlidesWidget = QtGui.QListWidget(MainWindow.slides_widget) self.SlidesWidget.setFrameShape(QtGui.QFrame.Box) self.SlidesWidget.setFrameShadow(QtGui.QFrame.Raised) 对我没用。
    • 我建议使用布局来定位小部件。
    • 我通过在背景色中使用透明度来解决这个问题嘿嘿嘿。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 2015-11-26
    相关资源
    最近更新 更多