Python GUI教程(八):在主窗口中调用对话框

本篇将会介绍:

  • 使用qt设计师创建两个窗口
  • 转换设计师UI代码为Python代码
  • 从主窗口中调用对话框窗口

一、创建两个窗口

根据本篇的最终目标——在主窗口中调用对话窗口,我们先使用qt设计师创建两个窗口,其中一个主窗口MainWindows,一个含有两个按钮的对话窗口Dialog。

通过qt设计师新建一个MainWindows窗口,并在其中放置一个按钮:

保存为UI文件,再新建一个对话窗口:

同样保存为UI文件。

这样我们本地文件夹有两个可供转换为Python代码的UI文件:

二、转换UI文件为Python代码文件

保存好两个窗口的UI文件之后,我们继续使用pyuic5工具,将这两个UI文件转换为Python代码文件。
打开命令行输入:

pyuic5 -x -o mainWindow.py mainWindow.ui

pyuic5 -x -o dialog.py dialog.ui

运行一下转换出来的Python文件,是否正常:

一切正常,接下来我们可以进行两个窗口的连接和调用了。

三、从主窗口中调用对话框窗口

在进行下一步之前,我们先在主窗口mainWindow中添加一个文本标签,设置文本为空,字体加大:

有个这个label我们可以将对对话框的操作,反馈在label标签中。

保存UI文件,使用pyuic5重新转换一次Python代码。

为了在主窗口代码中调用对话框窗口,我们需要在mainWindow.py文件中引入对话框窗口:

from GUI import dialog

然后定义在主窗口的主类中定义一个方法,用来显示对话框窗口:

def click_button(self):
    Dialog = QtWidgets.QDialog()
    ui = dialog.Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    Dialog.exec_()

定义好了方法,我们需要对按钮进行点击调用的绑定,这在setupUi()方法中进行设置:

self.pushButton.clicked.connect(self.click_button)

这样就实现了按钮点击绑定对话框。

我们知道,我们的对话框是有两个按钮的,一个“OK”,一个“Cancel”,在我们的GUI程序中,点击任意一个都会关闭对话框,效果似乎是一样的,但在PyQt5的内部机制的,这是两个不同的事件,下面我们就通过之前设置的label标签,展示其不同的机制。

我们修改一下click_button()方法,修改如下:

def click_button(self):
    Dialog = QtWidgets.QDialog()
    ui = dialog.Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    # Dialog.exec_()
    rsp = Dialog.exec_()
    if rsp == QtWidgets.QDialog.Accepted:
        self.label.setText("点击了OK")
    else:
        self.label.setText("点击了Cannel")

在这里我们将对话框的运行赋值给了一个变量,然后将其与QtWidgets.QDialog.Accepted进行比较,QtWidgets.QDialog.Accepted表示的是对话框的接收事件,也就是“OK”代表的事件,如果为接收时间,设置label标签为“点击了OK”,否则设置label标签为“点击了Cannel”

猜你也喜欢

  1. 匿名说道:

    大神你好 请问一下为什我加了from gui import dialog 主界面显示就没有了

    1. 州的先生说道:

      GUI是我的示例文件所在的文件夹

  2. 稻草人说道:

    文中“然后定义在主窗口的主类中定义一个方法,用来显示对话框窗口”,实现这个操作,在qtdesigner中就可以实现吧?不用再单独写代码链接的吧?

    1. 州的先生说道:

      都可以实现

      1. 匿名说道:

        感谢教程,十分有用。请问在qt设计师里面,如何连接两个窗口呢?就像楼上评论的那样,不用自己打py代码,而是在qt设计师中直接设计

  3. 匿名说道:

    请问为什么from GUI import dialog显示ModuleNotFoundError: No module named 'GUI'呢

    1. 州的先生说道:

      我的示例文件位于名为GUI的文件夹中

  4. 匿名说道:

    GUI文件夹的应该放在哪里?PyQt5中吗?

    1. 州的先生说道:

      文件能够import到的地方,同文件夹下也可以

  5. 匿名说道:

    老师,我已经把2个ui文件和2个py文件都放在同一GUI文件夹中了,但是还是显示No module named "GUI"

    1. 匿名说道:

      不应该是名为GUI的文件夹,应该是把副窗口所在的py文件,更名为GUI :razz:

      1. 匿名说道:

        把副窗口改为GUI了
        但提示
        ImportError: cannot import name 'dialog' from 'GUI' (D:\PyQt folder\GUI.py)

  6. 匿名说道:

    Traceback (most recent call last):
    File "D:/PyQt folder/mainWindow.py", line 11, in
    from GUI import dialog
    ImportError: cannot import name 'dialog' from 'GUI' (D:\PyQt folder\GUI.py)

    请问大神这个是怎么回事呢?

  7. 匿名说道:

    把副窗口的文件直接放在同一路径下,不用from,直接import就可以了

  8. 匿名说道:

    请问pyuic命令 -o和-x -o有什么区别

发表评论

邮箱地址不会被公开。