【问题标题】:how to upgrade from pyqt4 to pyqt5 in python如何在python中从pyqt4升级到pyqt5
【发布时间】:2020-06-30 16:41:48
【问题描述】:

我想将此代码从 pyqt4 升级或转换为 pyqt5,因为此代码与最新的 pyqt5 不兼容。

那么有人可以告诉我我可以在这段代码中做哪些重大更改以在 pyqt5 中运行它。

import sys
from PyQt4.QtCore import Qt
from PyQt4.QtCore import QRectF
from PyQt4.QtWidgets import QApplication
from PyQt4.QtGui import QColor
from PyQt4.QtGui import QFont
from PyQt4.QtGui import QPainter
from PyQt4.QtGui import QPixmap
from PyQt4.QtGui import QTextOption
from PyQt4.QtGui import QToolTip
from PyQt4.QtGui import QWidget

这是此代码的所有导入库

class AreaSelector(QWidget):

    def __init__(self, parent=None):

        QWidget.__init__(self, None, Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.setAttribute(Qt.WA_DeleteOnClose)
        self.setWindowState(Qt.WindowFullScreen)
        self.setAutoFillBackground(False)

        self.parent = parent
        self.start_x = 0
        self.start_y = 0
        self.end_x = 0
        self.end_y = 0
        self.current_x = 0
        self.current_y = 0

    def showEvent(self, event):

        self.bg = QPixmap.grabWindow(QApplication.desktop().winId())
        self.screen_geometry = QApplication.desktop().screenGeometry(self)

    def mousePressEvent(self, event):

        self.start_x = event.globalX()
        self.start_y = event.globalY()

    def mouseReleaseEvent(self, event):

        self.end_x = event.globalX()
        self.end_y = event.globalY()

请在此处查看完整代码full code

【问题讨论】:

    标签: python pyqt5 pyqt4


    【解决方案1】:

    将 PyQt4 代码翻译成 PyQt5 并非易事:

    • PyQt4 和 PyQt5 分别是 Qt4 和 Qt5 的封装,所以两者都受到那个转换变化的影响,其中一个转换是 Qt4 的 QtGui 子模块被分为 QtGui 和 QtWidgets 子模块Qt5 的。
    • 某些类和方法已被弃用,因此您必须找到等效的(如果存在)。

    在这种情况下,两种情况都会发生,第一种情况的解决方案很简单:您必须查看 Qt 文档并检查它属于哪个子模块,例如QToolTip,顶部有一个表格:

    观察QT += widgets中属于QtWidgets子模块的部分。

    但第二种情况稍微复杂一些,因为它涉及寻找可能在或不在同一类中的等价物,在这种情况下,它发生在已弃用的 QPixmap.grabWindow() 方法上(see here 了解更多信息)。进行搜索后,您可以将该代码替换为 QApplication.primaryScreen().grabWindow(0)

    综合以上,翻译为:

    import sys
    from PyQt5.QtCore import QRectF, Qt
    from PyQt5.QtGui import QColor, QFont, QPainter, QPixmap, QTextOption, QScreen
    from PyQt5.QtWidgets import QApplication, QToolTip, QWidget
    
    
    class AreaSelector(QWidget):
        def __init__(self, parent=None):
    
            QWidget.__init__(self, None, Qt.FramelessWindowHint)
            self.setAttribute(Qt.WA_TranslucentBackground)
            self.setAttribute(Qt.WA_DeleteOnClose)
            self.setWindowState(Qt.WindowFullScreen)
            self.setAutoFillBackground(False)
    
            self.parent = parent
            self.start_x = 0
            self.start_y = 0
            self.end_x = 0
            self.end_y = 0
            self.current_x = 0
            self.current_y = 0
    
        def showEvent(self, event):
            self.bg = QApplication.primaryScreen().grabWindow(0)
            self.screen_geometry = QApplication.primaryScreen().geometry()
    
        def mousePressEvent(self, event):
    
            self.start_x = event.globalX()
            self.start_y = event.globalY()
    
        def mouseReleaseEvent(self, event):
    
            self.end_x = event.globalX()
            self.end_y = event.globalY()
    
        def mouseMoveEvent(self, event):
    
            self.current_x = event.globalX()
            self.current_y = event.globalY()
            self.repaint()
    
            text = "Start: %sx%s \nEnd: %sx%s" % (
                self.start_x,
                self.start_y,
                self.current_x,
                self.current_y,
            )
            QToolTip.showText(event.pos(), text)
    
        def keyPressEvent(self, event):
            if event.key() == Qt.Key_Return:
                self._acceptSelection()
            elif event.key() == Qt.Key_Escape:
                self.close()
    
        def _acceptSelection(self):
    
            if self.parent is not None:
                self.parent.areaSelectEvent(
                    self.start_x, self.start_y, self.end_x, self.end_y
                )
            self.close()
    
        def paintEvent(self, event):
    
            painter = QPainter()
            painter.begin(self)
    
            painter.fillRect(self.screen_geometry, QColor(10, 10, 10, 125))
    
            self._paint_selection(painter)
            self._paint_usage_text(painter)
            painter.end()
    
        def _paint_usage_text(self, painter):
    
            font = QFont("Helvetica [Cronyx]", 26, QFont.Bold)
            painter.setFont(font)
            painter.setPen(QColor(255, 255, 255, 255))
    
            screen_width = self.screen_geometry.width()
            text_width = 800
            text_start_x = screen_width / 2 - text_width / 2
    
            screen_height = self.screen_geometry.height()
            text_height = 200
            text_start_y = screen_height / 2 - text_height / 2
    
            textoption = QTextOption(Qt.AlignCenter)
            textbox = QRectF(text_start_x, text_start_y, text_width, text_height)
            painter.drawText(
                textbox,
                "Click & Drag to select an area\n" "ENTER to confirm or ESC to cancel",
                textoption,
            )
            painter.drawRoundedRect(textbox, 20, 20)
    
        def _paint_selection(self, painter):
            """Draws the current user selection"""
            rectangle = QRectF()
    
            if self.start_x > self.current_x:
                rectangle.setLeft(self.current_x)
                rectangle.setRight(self.start_x)
    
            else:
                rectangle.setLeft(self.start_x)
                rectangle.setRight(self.current_x)
    
            if self.start_y > self.current_y:
                rectangle.setTop(self.current_y)
                rectangle.setBottom(self.start_y)
    
            else:
                rectangle.setTop(self.start_y)
                rectangle.setBottom(self.current_y)
    
            painter.drawPixmap(rectangle, self.bg, rectangle)
            painter.drawRect(rectangle)
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        main = AreaSelector()
        main.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 这个解决方案有效,但你能把它翻译成(TKINTER)gui代码吗?
    • @amit9867 我不知道,我只致力于 PyQt。每个库管理自己的逻辑。
    • @amit9867 不要要求将代码从一个库翻译到另一个库,在这种特殊情况下,它是升级(pyqt4-> pyqt5),所以它是有效的,但如果你想在图书馆你的问题太宽泛了,所以它可能会被关闭。
    • 我知道 tkinter 与 pyqt5 不同,但你能告诉我如何获取用户创建的框的坐标并在另一个脚本中使用它作为输入。
    猜你喜欢
    • 2016-08-31
    • 2020-08-03
    • 2015-06-12
    • 2017-10-19
    • 2016-10-08
    • 2018-03-15
    • 2017-11-09
    • 1970-01-01
    相关资源
    最近更新 更多