PyQt5 - 显示来自不同类的 QDialog
Posted
技术标签:
【中文标题】PyQt5 - 显示来自不同类的 QDialog【英文标题】:PyQt5 - Show QDialog from a different class 【发布时间】:2016-07-23 10:25:29 【问题描述】:我的应用由QMainWindow
和QToolBar
组成。我的目的是单击 QToolBar
元素并在单独的窗口 (QDialog
) 中打开日历。
我想在一个单独的类中创建一个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)
【问题讨论】:
您不是在self.calendarWidget = SMCalendarWidget(self)
这一行中创建CalendarDialog
,SMCalendarWidget
甚至存在吗?
是的,你是对的。这是一个转录错误。我已经更正了代码。
好的,您可以在“创建”toolBar
时分享代码吗?提供的似乎几乎是正确的,除了 CalendarDialog.__init__(self)
不带任何参数(self 是隐式的)并且你用一个参数调用它 CalendarDialog(self)
,可能你想在 __init__
中指定一个 parent
参数。
【参考方案1】:
发布的代码似乎几乎正确,这里是一个完整的工作示例,我添加了一些 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_()
【讨论】:
您的解决方案完美运行:D 谢谢!!现在我正在尝试将class CalendarDialog
移动到另一个 .py 文件,但它不起作用......你知道为什么吗??
任何错误?您执行的文件是否正确(带有app.exec_()
的文件)?
问题是大纲中没有显示任何错误......应用程序刚刚关闭......我正在考虑我的导入......我创建了一个新包main.widgets
,在这里我已找到CalendarDialog.py
。要导入它:from main.widgets import CalendarDialog
对吗?
这样你导入CalendarDialog
模块,然后使用类你应该使用CalendarDialog.CalendarDialog
,否则直接导入类使用from main.widgets.CalendarDialog import CalendarDialog
,为了更好区分我建议你为文件/模块使用小写名称(如果需要,使用下划线 _
)。
好的,它工作正常!谢谢。那么,关于 .py 文件命名的约定是什么?小写带下划线?以上是关于PyQt5 - 显示来自不同类的 QDialog的主要内容,如果未能解决你的问题,请参考以下文章