2016-07-23 7 views
0

Мое приложение состоит из QMainWindow с QToolBar. Моя цель - нажать на элемент QToolBar и открыть в отдельном окне (QDialog) календарь.PyQt5 - Показать QDialog из другого класса

Я хочу создать в отдельном классе a QDialog и называть его отображаемым с QMainWindow.

Это мой QDialog, просто календарь:

class CalendarDialog(QDialog): 

    def __init__(self): 
     super().__init__(self) 
     cal = QCalendarWidget(self)    

Теперь из QMainWindow я хотел бы показать календарь после триггером действий, как в следующем:

class Example(QMainWindow): 
    ... 
    calendarAction.triggered.connect(self.openCalendar) 
    ... 
    def openCalendar(self): 
     self.calendarWidget = CalendarDialog(self) 
     self.calendarWidget.show() 

Это не работает , После события, которое вызывает openCalendar, приложение закрывается без печати ошибки вывода. Я отложил некоторые отпечатки, и CalendarDialog.__init__(self) даже не вызван.

Код в отношении к QToolBar выглядит следующим образом:

openCalendarAction = QAction(QIcon(IMG_CALENDAR), "", self) 
openCalendarAction.triggered.connect(self.openCalendar) 
self.toolbar.addAction(openCalendarAction) 
+0

Вы не создаете 'CalendarDialog' в этой строке' self.calendarWidget = SMCalendarWidget (self) ',' SMCalendarWidget' даже существует? – Ceppo93

+0

yep, вы правы. Это была ошибка транскрипции. Я исправил код. – user2607702

+0

Хорошо, можете ли вы поделиться кодом, когда вы «создаете» 'toolBar'? Предоставленное представляется почти правильным, за исключением того, что 'CalendarDialog .__ init __ (self)' не принимает аргументов (сам неявный), и вы вызываете его 'CalendarDialog (self)' с аргументом, возможно, вы хотите указать аргумент 'parent' в '__init__'. – Ceppo93

ответ

0

Опубликованная код кажется почти правильно, вот полный рабочий пример, я добавил некоторые resize, чтобы размер виджета «приемлемый»:

from PyQt5.QtGui import * 
from PyQt5.QtWidgets import * 


class CalendarDialog(QDialog): 

    def __init__(self, parent): 
     super().__init__(parent) 
     self.cal = QCalendarWidget(self) 

     self.resize(300, 300) 
     self.cal.resize(300, 300) 

class Example(QMainWindow): 

    def __init__(self): 
     super().__init__() 
     self.resize(400, 200) 

     toolBar = QToolBar(self) 

     calendarAction = QAction(QIcon('test.png'), 'Calendar', self) 
     calendarAction.triggered.connect(self.openCalendar) 
     toolBar.addAction(calendarAction) 

    def openCalendar(self): 
     self.calendarWidget = CalendarDialog(self) 
     self.calendarWidget.show() 


app = QApplication([]) 

ex = Example() 
ex.show() 

app.exec_() 
+0

Ваше решение отлично работает: D Спасибо! Теперь я пытаюсь переместить 'Class CalendarDialog' в другой .py-файл, и он не работает ... у вас есть идея, почему? – user2607702

+0

Любая ошибка? Выполняете ли вы правильный файл (тот, у которого есть 'app.exec _()')? – Ceppo93

+0

Дело в том, что в контуре не отображаются ошибки ... приложение просто закрывается ... Я думаю о своих импортах ... Я создал новый пакет 'main.widgets', и здесь я нашел« CalendarDialog » .py'. Чтобы импортировать его: 'из main.widgets import CalendarDialog' является правильным? – user2607702