如何在python中从pyqt4升级到pyqt5

amit9867

我想将此代码从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()

请在此处查看完整代码

永乐

将PyQt4代码转换为PyQt5并非易事:

  • PyQt4和PyQt5分别是Qt4和Qt5的包装,因此两者都受该过渡的变化的影响,而过渡之一是Qt4的QtGui子模块被划分为Qt5的QtGui和QtWidgets子模块。
  • 不推荐使用某些类和方法,因此必须找到等效项(如果存在)。

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

在此处输入图片说明

并且部分QT += widgets表明它属于QtWidgets子模块。

但是第二种情况有些复杂,因为它涉及寻找可能在同一类中或可能不在同一类中的等效项,在这种情况下,QPixmap.grabWindow()它是通过不赞成使用方法发生的请参阅此处以获取更多信息)。搜索后,您可以将代码替换为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_())

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

pyqt5升级到qt5时如何更改qmake

来自分类Dev

PyQt4 到 PyQt5 的迁移

来自分类Dev

在ASP.NET MVC4中从Zurb Foundation 4升级到5。

来自分类Dev

在ASP.NET MVC4中从Zurb Foundation 4升级到5。

来自分类Dev

如何在Ubuntu 16.04中将gcc-5升级到gcc-7?

来自分类Dev

如何在Windows上将Python 2.7.6升级到Python 2.7.7

来自分类Dev

如何在Windows上将Python 2.7.6升级到Python 2.7.7

来自分类Dev

如何在Linux Ubuntu 14.04中将coreutils从8.21升级到8.24?

来自分类Dev

如何在Linux Ubuntu 14.04中将coreutils从8.21升级到8.24?

来自分类Dev

如何在Maverick 10.10中将Wine从1.2升级到1.5

来自分类Dev

如何在1and1 vps中从MySQL 5.1.72升级到5.5.45

来自分类Dev

升级的Laravel应用程序中的多态关系从4.2升级到5

来自分类Dev

如何在Anaconda中将python 2.7.8升级到2.7.9,而又不与环境中的其他组件冲突?

来自分类Dev

如何在Ubuntu 16.04中将php7.0升级到最新的旧版本?

来自分类Dev

将Rails 3.2升级到Rails 5

来自分类Dev

从Entity Framework 5升级到6

来自分类Dev

将VirtualBox从4.3升级到5

来自分类Dev

从Laravel 4.2升级到Laravel 5

来自分类Dev

将VirtualBox从4.3升级到5

来自分类Dev

从Laravel 4.2升级到Laravel 5

来自分类Dev

从systemrescuecd的grub配置从5升级到6

来自分类Dev

从PRISM 5升级到6

来自分类Dev

将ASP.NET MVC从4升级到5的奇怪错误

来自分类Dev

从ExtJs4升级到ExtJs5:GroupedColumn图表不起作用

来自分类Dev

从MVC4升级到MVC5

来自分类Dev

将react-router-dom从4升级到5

来自分类Dev

MVC4升级到MVC5时出现问题

来自分类Dev

如何在PyQt4中使用QtGui将输入变量收集到python程序中?

来自分类Dev

从Rails 3.2升级到Rails 4

Related 相关文章

热门标签

归档