PyQt5 - 显示来自不同类的 QDialog

Posted

技术标签:

【中文标题】PyQt5 - 显示来自不同类的 QDialog【英文标题】:PyQt5 - Show QDialog from a different class 【发布时间】:2016-07-23 10:25:29 【问题描述】:

我的应用由QMainWindowQToolBar 组成。我的目的是单击 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) 这一行中创建CalendarDialogSMCalendarWidget 甚至存在吗? 是的,你是对的。这是一个转录错误。我已经更正了代码。 好的,您可以在“创建”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的主要内容,如果未能解决你的问题,请参考以下文章

从不同类添加的小部件内的 PyQt5 停止计时器

pyqt5 QTableWidget 不会显示来自 PyEve 数据集的 id 键值

C++ 重载 == 比较来自不同类的对象

来自不同类的 Java 组件

如何定义来自不同类的多维数组

TestNG 执行顺序 - 它混合了来自不同类的测试