【Hello,PyQt】PyQt5中的一些对话框

QDialog类是一种特殊的窗口,它被设计出来作为和用户进行交换的对话框。QDialog上是可以包含其他的控件的,比如QLineEdit,QPushButton等。QDialog类的子类主要有QMessageBox,QFileDialog,QColorDialog,QFontDialog,QInputDialog等。其中QMessageBox是消息提示对话框,QFileDialog是文件选择对话框,QColorDialog是颜色选择对话框,QFontDialog是字体选择对话框,QInputDialog是输入对话框

普通对话框

创建对话框QDialog

在PyQt中,使用 QDialog 显示一个普通对话框通常需要以下步骤:

  1. 创建一个 QDialog 对象。
  2. 设置窗口模态。
  3. 设置对话框的属性,例如标题、布局和其他组件。
  4. 使用 exec_() 方法来显示对话框。
dialog = QDialog()
# 设置窗口模态
dialog.setModal(True)
dialog.setWindowTitle("Simple Dialog")
# 创建布局和标签
layout = QVBoxLayout()
label = QLabel("This is a simple dialog.")
layout.addWidget(label)
# 设置对话框布局
dialog.setLayout(layout)
# 显示对话框
dialog.exec_()

自定义对话框

class InputDialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("InputDialog")

        # 创建布局
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)

        # 添加组件
        self.label = QLabel("Enter your name:")
        self.line_edit = QLineEdit()
        self.ok_button = QPushButton("OK")
        self.cancel_button = QPushButton("Cancel")

        # 按钮布局
        button_layout = QHBoxLayout()
        button_layout.addWidget(self.ok_button)
        button_layout.addWidget(self.cancel_button)

        # 添加组件到主布局
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.line_edit)
        self.layout.addLayout(button_layout)

        # 按钮事件绑定
        self.ok_button.clicked.connect(self.accept)
        self.cancel_button.clicked.connect(self.reject)

    def get_input_text(self):
        return self.line_edit.text()

关闭对话框的三种方式

关闭对话框最直接的方式就是点击右上角的那个X,但是如果我的对话框是没有边框的,就像下面这样
在这里插入图片描述

或者说就是不通过那个X关闭对话框,想通过单击一个按钮关闭对话框,那么了解对话框关闭的方式就很有必要。

使用accept()和reject()方法

这两个方法可以模拟用户点击对话框窗口的确定和取消按钮

accept() 方法用于接受对话框的内容并关闭对话框。调用 accept() 方法会发出 accepted信号。

reject() 方法用于拒绝对话框的内容并关闭对话框。调用 reject() 方法会发出 rejected信号。

import sys
from PyQt5.QtWidgets import QApplication, QDialog, QPushButton

class MyDialog(QDialog):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 200, 100)

        self.button1 = QPushButton("close", self)
        self.button1.setGeometry(80, 30, 40, 25)
        self.button1.clicked.connect(self.accept)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    dialog = MyDialog()
    dialog.show()
    sys.exit(app.exec_())

这里在连接信号的时候需要注意一个问题,这个例子里链接槽函数的时候是直接用的self.accept,但我有个朋友是这样操作的
self.button1.clicked.connect(QDialog.accept)这样写按下按钮就不会正常退出进程已结束,退出代码-1073740791 (0xC0000409)
需要改成self.button1.clicked.connect(lambda :QDialog.accept(self))

使用close()方法

close()方法可以直接关闭对话框窗口,没有模拟按钮的点击事件。

使用done()方法

使用done()方法可以传入一个整型参数表示对话框关闭后的返回值。

输入对话框

QInputDialog提供了一些静态方法可以让用户方便的输入文本、整数等数据。

  • QInputDialog.getItem:提供了选择选项的下拉列表。
  • QInputDialog.getText:获取输入的文本内容。
  • QInputDialog.getInt:提供了获取输入数字的计时器。
    QInputDialog的用法非常简单,通过下面的例子就可以掌握其用法
from PyQt5.QtWidgets import QApplication, QPushButton, QVBoxLayout, QDialog, QInputDialog, QLabel, QLineEdit
import sys

class MyDialog(QDialog):
    def __init__(self):
        super().__init__()

        layout = QVBoxLayout()
        self.setLayout(layout)

        self.item_label = QLabel("Selected item:")
        layout.addWidget(self.item_label)

        self.text_label = QLabel("Entered text:")
        layout.addWidget(self.text_label)

        self.integer_label = QLabel("Entered integer:")
        layout.addWidget(self.integer_label)

        item_button = QPushButton("Get Item")
        item_button.clicked.connect(self.get_item)
        layout.addWidget(item_button)

        text_button = QPushButton("Get Text")
        text_button.clicked.connect(self.get_text)
        layout.addWidget(text_button)

        int_button = QPushButton("Get Integer")
        int_button.clicked.connect(self.get_integer)
        layout.addWidget(int_button)

    def get_item(self):
        items = ['Apple', 'Banana', 'Orange', 'Grapes']
        item, ok = QInputDialog.getItem(self, "Item Dialog", "选择你最喜欢的水果:", items, 0, False)
        if ok and item:
            self.item_label.setText("Selected item: " + item)

    def get_text(self):
        text, ok = QInputDialog.getText(self, "Text Dialog", "输入你的名字:")
        if ok and text:
            self.text_label.setText("Entered text: " + text)

    def get_integer(self):
        value, ok = QInputDialog.getInt(self, "Integer Dialog", "输入你的年龄:", 18, 0, 100, 1)
        if ok:
            self.integer_label.setText("Entered integer: " + str(value))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    dialog = MyDialog()
    dialog.show()
    sys.exit(app.exec_())

运行效果
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

字体颜色对话框

使用QColorDialog.getColor()方法显示一个可以选择字体颜色和背景颜色的对话框。字体的颜色是不能直接设置的,要先创建一个调试板对象,调色板对象设置颜色,然后传递给指定的控件(setPalette()方法)

from PyQt5.QtWidgets import QApplication, QPushButton, QVBoxLayout, QDialog, QLabel, QColorDialog
from PyQt5.QtGui import QColor, QPalette
import sys

class MyDialog(QDialog):
    def __init__(self):
        super().__init__()

        layout = QVBoxLayout()
        self.setLayout(layout)

        self.color_label = QLabel("Hello, World!")
        layout.addWidget(self.color_label)

        font_color_button = QPushButton("选择字体颜色")
        font_color_button.clicked.connect(self.choose_font_color)
        layout.addWidget(font_color_button)

        bg_color_button = QPushButton("选择背景颜色")
        bg_color_button.clicked.connect(self.choose_bg_color)
        layout.addWidget(bg_color_button)

    def choose_font_color(self):
        color = QColorDialog.getColor()
        if color.isValid():
            # 设置字体颜色
            p = QPalette()
            p.setColor(QPalette.WindowText, color)
            self.color_label.setPalette(p)

    def choose_bg_color(self):
        color = QColorDialog.getColor()
        if color.isValid():
            # 获取当前标签的字体颜色,防止设置背景时将字体设置成默认颜色
            font_color = self.color_label.palette().color(self.color_label.foregroundRole())

            p = QPalette()
            p.setColor(QPalette.Window, color)
            p.setColor(QPalette.WindowText,font_color)
            self.color_label.setAutoFillBackground(True)
            self.color_label.setPalette(p)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    dialog = MyDialog()
    dialog.show()
    sys.exit(app.exec_())

运行效果

  • 设置字体颜色
    在这里插入图片描述

  • 设置背景颜色
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/512721.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OKCC厂家原来还有语音通知系统

最近遇到一个场景是这样的,可能是最开始的需求不明确,代理商以为他的客户场景需要用AI语音机器人来实现,于是已经购买了一套机器人系统给客户上线,但是由于系统并发问题,客户那边的呼叫任务机器人完不成,于…

OpenAI ChatGPT 与 Google Gemini 特性深度对比分析

ChatGPT与Gemini对决:AI 语言模型的未来之战 介绍 人工智能语言模型的出现开辟了技术的新领域。 最近,ChatGPT和Gemini一直是LLM的主要话题,并且有很多关于它们功能的比较。 在本文中,我们比较了该领域的两个领先者:Op…

书生·浦语大模型实战营 | 第1次学习笔记

前言 书生浦语大模型应用实战营 第二期正在开营,欢迎大家来学习。(参与链接:https://mp.weixin.qq.com/s/YYSr3re6IduLJCAh-jgZqghttps://mp.weixin.qq.com/s/YYSr3re6IduLJCAh-jgZqg) 第一堂课的视频链接:https://m…

AI在招聘中的优势:如何颠覆传统?

在当今快节奏的商业环境中,企业争相寻找提升效率的方法,特别是在招聘这一关键领域。人工智能(AI)凭借其卓越的数据处理能力和学习算法,为企业的招聘流程带来了革命性的变化。但是,人工智能到底是如何在招聘…

【设计】枚举的应用

什么是枚举 枚举是一种特殊的数据类型,用于定义具有固定个数的常量集。它可以帮助我们更好地管理常量,使代码更易于阅读和维护。 Java枚举是一种高效、可读性强的常量管理方式,它可以使代码更易于维护和扩展。使用Java枚举可以帮助我们有效…

frp内网穿透,让外网可以访问内网

需求 我们的svn部署在内网,用的一直没问题,但是有时候有需求在外网访问svn,进行提交更新等操作,这时候就有了内网穿透这个需求。 当然,我们也可以借助花生壳等软件进行内网穿透,傻瓜化操作,也…

快速成长的秘诀|学会自我培养和培养他人

> 插:AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家…

TDP3500泰克TDP3500差分探头

181/2461/8938产品概述: 泰克 TDP3500 探头是一款差分端有源探头,可为高频测量提供更真实的信号再现和保真度。它还提供当今数字系统设计所需的高速电气和机械性能。泰克 TDP3500 探头专为使用并直接连接到具有 TekVPI™ 探头接口的泰克示波器而设计。 …

Python(乱学)

字典在转化为其他类型时,会出现是否舍弃value的操作,只有在转化为字符串的时候才不会舍弃value 注释的快捷键是ctrl/ 字符串无法与整数,浮点数,等用加号完成拼接 5不入??? 还有一种格式化的方法…

Redis热点Key问题分析与解决

目录 一、问题现象描述 二、什么是热点Key 三、热点Key的危害 3.1 Redis节点负载过高 3.2 Redis集群负载不均 3.3 Redis集群性能下降 3.4 数据不一致 3.5 缓存击穿 四、热点Key产生的原因分析 4.1 热点数据 4.2 业务高峰期 4.3 代码逻辑问题 五、如何检测热点Key …

dm8 开启归档模式

dm8 开启归档模式 1 命令行 [dmdbatest1 dm8]$ disql sysdba/Dameng123localhost:5237服务器[localhost:5237]:处于普通打开状态 登录使用时间 : 3.198(ms) disql V8 SQL> select name,status$,arch_mode from v$database;行号 NAME STATUS$ ARCH_MODE ----------…

浅谈分布式光伏电站的运维管理

摘要:随着近些年我国对节能降耗关注力度的持续加大,为满足人们不断增长的电能需求,光伏发电产业得到迅猛发展,其中分布式光伏发电的比重持续增长。在打赢脱贫攻坚战的大背景下,国家电网公司探索出一条“阳光扶贫”的扶…

JVM 记录

记录 工具 https://gceasy.io 资料 尚硅谷宋红康JVM全套教程(详解java虚拟机) https://www.bilibili.com/video/BV1PJ411n7xZ?p361 全套课程分为《内存与垃圾回收篇》《字节码与类的加载篇》《性能监控与调优篇》三个篇章。 上篇《内存与垃圾回收篇…

使用docker部署MongoDB数据库

最近由于工作需要搭建MongoDB数据库:将解析的车端采集的数据写入到数据库,由于MongoDB高可用、海量扩展、灵活数据的模型,因此选用MongoDB数据库;由于现公司只有服务器,因此考虑容器化部署MongoDB数据,特此…

java头歌-JDBC基础编程练习

第1关:JDBC更新员工密码 package step1;import java.sql.*;public class UpdatePass {// 修改数据public static void updateDB() {/********* Begin *********/// 第一步:加载驱动try {Class.forName("com.mysql.jdbc.Driver");} catch (Clas…

一种遥感影像多类变化检测方法

多任务学习孪生网络的遥感影像多类变化检测 马惠1, 刘波2, 杜世宏2 1.河南省国土空间调查规划院,郑州 450016 2.北京大学遥感与地理信息系统研究所,北京 100871 摘要: 精确掌握土地覆盖/利用的变化及变化类型对国土空间规划、生态环境监测、灾害评估等有着重要意义,然而现有…

SRC实战-cookie注入漏洞

谷歌语法-信息收集 1.查找带有ID传参的网站(可以查找sql注入漏洞) inurl:asp idxx 2.查找网站后台(多数有登陆框,可以查找弱口令,暴力破解等漏洞) site:http://xxxx.com “admin” site:http://xx.com int…

ISOLAR AUTOSAR 组件供需端口图标

软件组件端口类型分为供型端口(Provision Port)、需型端口(Required Port)、和供需型端口(Provision Required Port),其中供需性不常用。 其中又分为S/R 发送者、接受者接口,C/S 客户…

【CANN训练营笔记】AscendCL图片分类应用(C++实现)

样例介绍 基于PyTorch框架的ResNet50模型,对*.jpg图片分类,输出各图片所属分类的编号、名称。 环境介绍 华为云AI1s CPU:Intel Xeon Gold 6278C CPU 2.60GHz 内存:8G NPU:Ascend 310 环境准备 下载驱动 wget ht…

STM32学习笔记(11_2)- W25Q64简介和工作原理

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。 最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com 本期学…