最近在学习PyQt,正好记录一些笔记:

安装PyQt的方法我是跟随这个帖子实现的:

python+pycharm+pyqt5安装教程「建议收藏」-腾讯云开发者社区-腾讯云 (tencent.com)

(链接最后访问时间:2023年9月27日)

该帖子和其它很多帖子都是用Pycharm安装pyqt5和QtDesigner搭配使用,基本方法如下:

  1. 安装和配置好所需工具后,从pycharm可以打开QtDesigner来进行界面设计。
  2. 将其保存为“.ui”文件。
  3. 在Pycharm中右键该文件,选择PyUIC工具,将该ui界面转换成对应的python文件。

以实现简化UI编写代码的目的。

设计窗口:

在Pycharm默认在左侧的Project栏中,右键,选择External Tools(外部工具),选择QtDesigner(需提前配置,详情请看上述链接的文章)。

这时候会弹出一个新的界面如图:

现在这个窗口已经有了我们这次实验的主窗口所需要的所有东西了,但是这个界面看上去有点比例太奇怪了,于是可以从两个方面入手来解决:

  1. 将按钮变大
  2. 将窗口变小

这时,界面右侧的属性编辑器可以帮助我们来做这件事,当你鼠标点击窗口的不同控件时,属性编辑器会自动切换为你所选择的控件的属性,我们先来调整窗口大小:

点击窗口,右侧属性界面处可以看到“QObject”中“QObjectName”属性是“MainWindow”,这个名称属性可以随意修改成你需要的,对于窗口来说,“MainWindow”这个名字还好,这里不做修改。

在“QWidget”中有geometry属性,可以看到默认给的是“[(0,0),800x600]”这个属性的意思是,该窗口的位置是(0,0),宽800,高600。可以将该菜单展开,修改参数,我认为对于这个实验来说,200x200就够用,所以如图修改:

可以看到,窗口明显变小了。

但是这么小的按键,看着不清晰,比例也不合适,那么我们下一步修改按键的属性。

点击按键,右侧属性编辑器会切换为该按键的属性:

“ObjectName”属性是“pushButton”,我们这里可以做一下修改,因为本次实验只有这一种按键,甚至只有这一个按键,所以我可以给他改名为“Button”或者“btn”或任何便于理解的名称,因为只有一个按键所以也不用担心混淆。

我希望他能够占满窗口一些,原本属性中的(10,10),表示其左上角的坐标,这也说明这个按键距离窗口左侧和上侧分别是10和10,窗口我们修改为200x200,我希望按键右侧距离窗口右侧也是10,那么按键的宽度就是200-10-10为180,所以修改宽度为180。

高度有一些不太一样,如果高度设计为180的话,其可能会显示不全,这是因为主窗口虽然尺寸为200x200,但其底部边框却占了一部分尺寸,大概是20-30左右。

所以按键高度设置为140比较合适

现在该窗口已经设计完了,那么我们将其保存,名字就叫“menu.ui”。

链接UI界面和代码:

回到Pycharm中,在Project目录找到这个“menu.ui”,右键,选择“External Tools”(外部工具),选择“pyuic”,这样就会生成一个“menu.py”的文件,这个文件记录了你的UI设计。

打开"main.py"函数,需要import这些:

import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow
from menu import Ui_MainWindow as menu_ui

这里最后一行代码的意思就是从"menu.py"文件中,导入Ui_MainWindow这个函数,并命名为menu_ui。

创建一个类,命名为Menu:

class Menu(QMainWindow, menu_ui):
    def __init__(self):
        super(Menu, self).__init__()
        self.setupUi(self)

在“main.py”的主函数入口中:

if __name__ == '__main__':
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    app = QApplication(sys.argv)
    MainWindow = Menu()
    MainWindow.show()
    sys.exit(app.exec_())

第一行的意思是开启高分辨率兼容,以防在高分辨率屏幕出现显示问题。

现在点击运行,将会看到窗口弹出:

按钮功能的链接:

现在,点击这个按钮,不会有任何反应,我们需要将按钮按下的动作和一个功能做链接。

实现方法:

在Menu类中定义一个新函数,这个函数记录了按下按钮的操作,并将该函数和按下按钮做链接。

    def push(self):
        print("push")

这里,我新建了一个函数叫做push,他的功能是可以在命令行界面中打印“push”这个字符。接下来我们将其和按钮链接。

在Menu类的__init__(self)中,加入一行链接用的代码。整个类的代码如下:

class Menu(QMainWindow, menu_ui):
    BN = 0
    def __init__(self):
        super(Menu, self).__init__()
        self.setupUi(self)
        self.btn.clicked.connect(self.push)
    def push(self):
        print("push")

self.btn.clicked.connect(self.push)。这行代码将self.push这个函数和名为btn的按钮的clicked事件关联在一起了。现在我们运行,并点击按钮,就可以看到命令行中打印了Push字样。

第二个窗口:

本此实验的目的是,点击按钮,弹出第二个窗口,所以我们还需要一个窗口。

但是这一次我觉得打开QtDesigner太麻烦了,因为第二个窗口也只有一个按钮,但是只有这个按钮的一半宽度,两个窗口长得很接近,我不想用QtDesigner来做设计,那么可以从".py"文件直接入手修改。

将menu.py复制一份,并重命名为另一个名称,popup.py。

在main.py中加入一个import:

from popup import  Ui_MainWindow as pop_ui

打开popup.py

可以看到这里面有Ui_MainWindow这个类,类中包括了setupUi和retranslateUi两个函数。其中setupUi是定义窗口中的控件的,retranslateUi用于修改控件的text等属性。

如果我想只修改按钮的尺寸,那么我们在setupUi找到对应代码即可:

于是我找到了这两行:

self.btn = QtWidgets.QPushButton(self.centralwidget)
self.btn.setGeometry(QtCore.QRect(10, 10, 180, 140))

这里可以看到之前设置过的尺寸属性,那么如果我希望他只有一般大小,就将180改为90就好:

self.btn = QtWidgets.QPushButton(self.centralwidget)
self.btn.setGeometry(QtCore.QRect(10, 10, 90, 140))

现在我们的新窗口已经设计好了,只需要在代码中实现按下按钮,弹出它即可。

为了弹出这个窗口,在main.py,也需要新写一个类,来代表这个窗口,我们可以直接复制Menu类,并做一些修改即可:

class Pop(QMainWindow, pop_ui):
    def __init__(self):
        super(Pop, self).__init__()
        self.setupUi(self)
        self.btn.clicked.connect(self.push)
    def push(self):
        print("push")

之前在main.py的Menu类中,已经有了push这个函数,它的功能是打印“push”这个字符串,那么我们只需要在这后面加入几行代码,即

    def push(self):
        print("push")
        self.ui_pop = Pop()
        self.ui_pop.show()

这样,在点击按钮后,将会弹出第二个窗口:

如果希望弹出第二个窗口的时候关闭第一个,只需要在后面加一句self.close()即可

附上源码:

ZIHENGFENG/PyQt_CSDN: 这个是CSDN中PyQt内容的源码 (github.com)

本文实现了 PyQt5 个各种 弹出 窗口 :输入框、消息框、文件对话框、颜色对话框、字体对话框、自定义对话框 其中,为了实现自定义对话框的返回值,使用了信号/槽 本文基于 windows 7 + python 3.4 取得 弹出 窗口 的返回值 全部代码: from PyQt5 . Qt Widgets import * from PyQt5 . Qt Core import Qt , pyqt Signal, QT imer class MyWindow(QWidget): def __init__(self): super().__init__() self.setWindowTi
PyQt 6中,按钮切换页面可以通过使用QStackedWidget和QPushButton来实现。 首先,我们需要创建 一个 QStackedWidget作为容器来存储不同的页面。QStackedWidget类提供了 一个 堆叠在一起的 窗口 部件,只有 一个 可见的子 窗口 ,可以通过索引或子 窗口 的名称来访问。 然后,我们可以创建多个页面(例如,使用QWidget或其他基础 窗口 部件类)并将它们添加到QStackedWidget中。每个页面代表 一个 特定的界面,并使用addWidget()方法将其添加到QStackedWidget中。 接下来,我们可以创建 一个 QPushButton作为切换按钮,并连接它的clicked信号到槽函数。槽函数将根据需要切换页面。 在槽函数中,我们可以使用setCurrentIndex()方法来设置QStackedWidget当前显示的页面。通过传递页面索引(0表示第 一个 页面,1表示第二个页面,以此类推)来将希望显示的页面设置为当前页面。 最后,我们需要在应用程序主循环中运行exec_()方法来启动应用程序并显示UI。用户可以点击按钮来切换页面。 下面是 一个 简单的示例代码: ``` python import sys from PyQt 6. Qt Widgets import QApplication, QWidget, QPushButton, QStackedWidget, QVBoxLayout class MainWindow(QWidget): def __init__(self): super().__init__() self.stacked_widget = QStackedWidget(self) page1 = QWidget() page2 = QWidget() self.stacked_widget.addWidget(page1) self.stacked_widget.addWidget(page2) button = QPushButton("切换页面", self) button.clicked.connect(self.switch_page) layout = QVBoxLayout() layout.addWidget(button) layout.addWidget(self.stacked_widget) self.setLayout(layout) def switch_page(self): current_page = self.stacked_widget.currentIndex() if current_page == 0: self.stacked_widget.setCurrentIndex(1) else: self.stacked_widget.setCurrentIndex(0) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec()) 通过运行上述代码,您将得到 一个 带有切换按钮和两个页面的 窗口 。点击按钮将在两个页面之间切换。
CSDN-Ada助手: 恭喜你开始博客创作!标题很吸引人,我对PyQt5也非常感兴趣。你提到的按键弹出另一个窗口的主题听起来很有趣,我期待着阅读你的具体实现方法和经验分享。在下一步的创作中,建议你可以更详细地介绍PyQt5的基础知识,例如如何创建窗口、添加按键功能等等,这样可以帮助那些刚开始学习PyQt5的读者更好地理解和跟随你的教程。谦虚地说,我相信你的博客将为读者提供很多帮助和启发。加油! 推荐【每天值得看】:https://bbs.csdn.net/forums/csdnnews?typeId=21804&utm_source=csdn_ai_ada_blog_reply1 PyQt5入门笔记1--------按键弹出另一个窗口 CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天最佳新人】榜单,全部的排名请看 https://bbs.csdn.net/topics/617331809。