2017-04-24 2 views
0

Also habe ich aus meinem Projekt auf dieses Problem geschlossen, dass das setCentralWidget aus der Slides Widget Klasse in die Hauptfensterklasse injiziert die Funktion der Buttons (dh das Öffnen eines neuen Widgetfensters) auslöst Das Hauptfenster funktioniert überhaupt nicht.PyQt: setCentralWidget kollidiert mit der QPushButton Funktion

Wenn ich das SetCentralWidget entferne funktionieren die Tasten gut, ohne irgendwelche Funktionen zu beeinträchtigen, welchen Ansatz sollte ich dafür verwenden? Sollte ich eine andere Form des Aufrufs der Folien-Widget-Klasse verwenden?

Jede Hilfe wäre willkommen, wie immer! Vielen Dank!

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_()) 

Antwort

1

Das Problem entsteht dadurch, dass zuerst die Taste und auf diese die CentralWidget platziert wird, ist die Lösung, die Taste in der CentralWidget zu platzieren, in Slides dh.

müssen Sie ändern:

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

zu:

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

und

self.groupBox = QtGui.QGroupBox(MainWindow) 

zu:

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

Co mplete Code:

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_()) 
+0

Ich hatte diese hinterhältige 'self.setCentralWidget (self.slides_widget) finden' knapp unter dem Druckknopf haha ​​Ich habe es arbeiten! Prost! Aber ich erkannte, dass, wenn ich einen Rahmen für meine Folien, die im MainWindow aufgerufen wird, legt es die Bilder überlappt ... Irgendeine Idee, wie ich den Rahmen HINTER den Bildern nennen? 'self.SlidesWidget = QtGui.QListWidget (MainWindow.slides_widget) self.SlidesWidget.setFrameShape (QtGui.QFrame.Box) self.SlidesWidget.setFrameShadow (QtGui.QFrame.Raised)' hat den Trick für mich nicht. – madLad

+0

Ich empfehle Layouts zu verwenden, um Widgets zu finden. – eyllanesc

+0

Ich habe es mit der Verwendung von Transparenz in der Hintergrundfarbe hehehe herausgefunden. Vielen Dank! – madLad

Verwandte Themen