首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在pyqt中的类之间继承?

如何在pyqt中的类之间继承?
EN

Stack Overflow用户
提问于 2019-03-10 23:46:15
回答 1查看 1.4K关注 0票数 1

为了跟踪进度,这是关于在PyQt5 .Here中使用不同类练习的第三个问题是指向我之前的问题的链接:opening a new windowOpen a file from main window to a new window in PyQt5 (in different files)

我正在尝试使用两个类,一个只有一个按钮,当它被按下时,它会加载一个文件,并在另一个类的QTextEdit中显示文本。

在第一个问题中,我被建议作为使用更多类的替代方案,它们可以从QMainWindow继承,所以我查找了更多信息来做到这一点:PyQt class inheritance

第二个问题代码确实起作用了,但它会同时显示两个窗口,所以这个问题:PyQt: How to hide QMainWindow引导我编写了这个代码(我在这里附上这个代码,因为它与链接中的略有不同,而且我应用了它在答案中说的内容):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys, os
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton

class Dialog_02(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Dialog_02, self).__init__(parent, QtCore.Qt.Window)

        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        myBoxLayout = QVBoxLayout()

        Button_02 = QPushButton ("Show Dialog 01")
        myBoxLayout.addWidget(Button_02)

        self.setLayout(myBoxLayout)
        self.setWindowTitle('Dialog 02')

        Button_02.clicked.connect(self.closeAndReturn)

    def closeAndReturn(self):
        self.close()
        self.parent().show()


class Dialog_01(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Dialog_01, self).__init__()

        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        myBoxLayout = QVBoxLayout()

        Button_01 = QPushButton ("Show Dialog 02")
        myBoxLayout.addWidget(Button_01)

        self.setLayout(myBoxLayout)
        self.setWindowTitle('Dialog 01')

        Button_01.clicked.connect(self.callAnotherQMainWindow)

    def callAnotherQMainWindow(self):
        self.hide()
        self.dialog_02 = Dialog_02(self)
        self.dialog_02.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    dialog_1 = Dialog_01()
    dialog_1.show()
    sys.exit(app.exec_())

在这段代码中,我没有继承,但它工作得很好。

问题是,当我尝试遵循原始问题代码中相同的语法时,它不会运行,我不确定我是否能很好地继承。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
import os
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtWidgets import QPushButton, QVBoxLayout, QTextEdit, QHBoxLayout, QLabel, QMainWindow, QAction, QFileDialog

class SecondWindow(QWidget):
    def __init__(self, Window):
        super(SecondWindow, self).__init__(parent, QtCore.Qt.Window)

        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        self.text = QTextEdit(self)
        self.btn_return= QPushButton("Return")
        self.init_ui()

    def init_ui(self):
        v_layout = QVBoxLayout(self)
        v_layout.addWidget(self.text)
        v_layout.addWidget(self.btn_return)
        self.setLayout(v_layout)
        self.setWindowTitle('Opened Text')

        self.btn_return.clicked.connect(self.closeAndReturn)

    def closeAndReturn(self):
        self.close()
        self.parent().show()

class Window(QMainWindow):

    textChanged = QtCore.pyqtSignal(str)

    def __init__(self, *args):
        super(Window, self).__init__()

        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        self.img = QLabel()
        self.load_file= QPushButton('Load')

        self.width = 400
        self.height = 150        

        self.init_ui()

    def init_ui(self):
        self.img.setPixmap(QtGui.QPixmap("someimage.png"))


        h_layout = QHBoxLayout()
        v_layout = QVBoxLayout()
        h_final = QHBoxLayout()

        h_layout.addWidget(self.img)

        v_layout.addWidget(self.load_file)

        h_final.addLayout(h_layout)
        h_final.addLayout(v_layout)

        self.load_file.clicked.connect(self.loadafile)

        self.setLayout(h_final)
        self.setWindowTitle('Main Window')
        self.setGeometry(600,150,self.width,self.height)

    @QtCore.pyqtSlot()
    def loadafile(self):
        filename = QFileDialog.getOpenFileName(self, 'Open File', os.getenv('HOME'))
        with open(filename[0], 'r') as f:
            file_text = f.read()
            self.textChanged.emit(file_text)

        self.hide()
        self.dialog_02 = SecondWindow(self)
        self.dialog_02.show()

def main():
    app = QApplication(sys.argv)
    main = Window()
    s = SecondWindow(main)
    main.textChanged.connect(s.text.append)
    main.show()



    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-11 00:47:20

您正在耦合许多类:如果在某个时刻SecondWindow没有父类,会发生什么?那么,您的代码将会有问题,您将不得不对其进行大量修改,以使其正常工作。所以首先要设计每个类的行为,例如SecondWindow必须警告其他窗口它被点击了,它必须有一个更新文本的方法。同样,Window必须通知有新文本可用。

另一方面,QMainWindow已经有了一个predefined layout,所以您必须在放置其他小部件的位置创建一个centralwidget。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class SecondWindow(QtWidgets.QWidget):
    closed = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(SecondWindow, self).__init__(parent, QtCore.Qt.Window)
        self.text = QtWidgets.QTextEdit()
        self.btn_return= QtWidgets.QPushButton("Return")
        self.init_ui()

    def init_ui(self):
        v_layout = QtWidgets.QVBoxLayout(self)
        v_layout.addWidget(self.text)
        v_layout.addWidget(self.btn_return)
        self.setWindowTitle('Opened Text')
        self.btn_return.clicked.connect(self.close)
        self.btn_return.clicked.connect(self.closed)

    @QtCore.pyqtSlot(str)
    def update_text(self, text):
        self.text.setText(text)
        self.show()

class Window(QtWidgets.QMainWindow):
    textChanged = QtCore.pyqtSignal(str)

    def __init__(self, *args):
        super(Window, self).__init__()
        self.img = QtWidgets.QLabel()
        self.load_file= QtWidgets.QPushButton('Load')
        self.width = 400
        self.height = 150        
        self.init_ui()

    def init_ui(self):
        self.img.setPixmap(QtGui.QPixmap("someimage.png"))
        self.load_file.clicked.connect(self.loadafile)
        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        h_layout = QtWidgets.QHBoxLayout(central_widget)
        h_layout.addWidget(self.img)
        h_layout.addWidget(self.load_file)
        self.setWindowTitle('Main Window')
        self.setGeometry(600,150,self.width,self.height)

    @QtCore.pyqtSlot()
    def loadafile(self):
        filename, _ = QtWidgets.QFileDialog.getOpenFileName(self, 'Open File', os.getenv('HOME'))
        if filename:
            with open(filename, 'r') as f:
                file_text = f.read()
                self.textChanged.emit(file_text)
                self.close()

def main():
    app = QtWidgets.QApplication(sys.argv)
    main = Window()
    s = SecondWindow()
    main.textChanged.connect(s.update_text)
    s.closed.connect(main.show)
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55093572

复制
相关文章
深入理解 Laravel 中 config 配置加载原理
本文重点讲解第二个config配置加载。第一个请查看 深入理解 Laravel 中.env 文件读取
全栈程序员站长
2021/11/10
1.2K0
Yaf---Session | 模板 | 模型 | Cli模式
Yaf_Session是Yaf对Session的包装, 实现了Iterator, ArrayAccess, Countable接口, 方便使用.关于Yaf_Session的文档介绍:http://www.laruence.com/manual/yaf.class.session.html
Marco爱吃红烧肉
2021/07/23
2K0
Laravel框架中composer自动加载的实现分析
自动加载允许你通过即用即加载的方式来加载需要的类文件,而不用每次都写繁琐的require 和include语句。因此,每一次请求的执行过程都只加载必须的类,也不不要关心类的加载问题,只要需要的时候直接使用即可。
用户8832582
2021/07/13
9150
Laravel中Facade的加载过程与原理详解
前言 本文主要给大家介绍了关于Laravel中Facade加载过程与原理的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 简介
用户2323866
2021/07/08
5790
laravel 自定义常量方法
step1 按路径生成constants文件 app/config/constants.php
全栈程序员站长
2021/10/25
7590
MySQL在删除表时I/O错误原因分析
问题现象 最近使用sysbench测试MySQL,由于测试时间较长,写了一个脚本按prepare->run->cleanup的顺序在后台跑着。跑完后察看日志发现一个问题,MySQL服务的错误日志中出现多条类似以下信息的报错: [ERROR] InnoDB: Trying to do I/O to a tablespace which does not exist. I/O type: read, page: [page id: space=32, page number=57890], I/O length
腾讯数据库技术
2018/07/19
1.9K0
在 Laravel 中编写高级的 Artisan 命令
在上一篇教程中,学院君向大家介绍了什么是 Artisan 命令,系统内置的 Artisan 命令,以及如何编写一个简单的 Artisan 命令。我们完全可以将命令行看作与 Web 应用同等的控制台应用(实际上,Laravel 底层也是这么做的),它具备自己的路由、Kernel、输入、控制器(命令类)、输出。因此,在这篇教程中,我们将更进一步,一起来看下如何编写更加高级的 Artisan 命令,比如带输入参数、选项,以及能够与用户互动,输出图表/进度条的 Artisan 命令。
学院君
2021/01/08
8.3K0
laravel 预加载特定的列
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/112351.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/08
7150
laravel 预加载特定的列
[Go] go常量中的无类型常量
Go语言的常量有个不同寻常之处。虽然一个常量可以有任意一个确定的基础类型,例如int或float64,或者是类似time.Duration这样命名的基础类型,但是许多常量并没有一个明确的基础类型。
唯一Chat
2020/12/29
1.6K0
PHP之内置web服务器
这个主要是用来做本地的开发用的。不能用于线上环境。现在我就介绍一下这个工具如何使用。
魔王卷子
2019/05/28
3.1K0
Laravel 6.12.0 版本发布,支持从扩展包加载模型工厂
Laravel 开发团队本周发布了 6.12.0 版本,此次更新支持从扩展包加载模型工厂,通过 dump 函数测试 Session 数据,以及很多其他新特性。另外,这次更新还包含了很多第三方开发者贡献的、用于优化重复操作的语法糖,例如过滤请求输入字段中的非布尔值。
学院君
2020/02/19
7760
PHP之内置web服务器
这个主要是用来做本地的开发用的。不能用于线上环境。现在我就介绍一下这个工具如何使用。
魔王卷子
2019/05/24
3.8K0
PHP之内置web服务器
行为设计模式及其在JVM中的应用
在上篇文章中我们说到创建者设计模式。 现在我们来看看行为设计模式。 这些模式关注我们的对象如何相互交互或者我们如何与它们交互。
从大数据到人工智能
2022/01/20
9940
【Java 虚拟机原理】Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )
类加载时机 : Java 程序执行时 , 并不是一开始将所有的字节码文件都加载到内存中 , 而是用到时才进行加载 ;
韩曙亮
2023/03/29
3.7K0
【Java 虚拟机原理】Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )
Java中的常量
常量值又称为字面常量,它是通过数据直接表示的,因此有很多种数据类型,像整型和字符串型等。通常是指在Java程序中固定不变的数据。
用户8639654
2021/07/19
9120
在Laravel 的 Blade 模版中实现定义变量
有时候我们需要在 Laravel 的 Blade 模版中定义一些变量,而 Blade 却没有提供这样的方法/
用户8664418
2021/07/13
3.7K0
点击加载更多

相似问题

Laravel:如何从刀片模板访问类常量

20

laravel访问刀片中的模型常量

20

未加载Laravel刀片页面

12

在laravel刀片指令中使用未定义的常量

123

无法加载laravel刀片文件中的图像

231
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文