首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在python中从pyqt4升级到pyqt5

如何在python中从pyqt4升级到pyqt5
EN

Stack Overflow用户
提问于 2020-03-19 14:16:20
回答 1查看 2K关注 0票数 2

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

因此,有人能告诉我,我可以在这段代码中做哪些重大更改,以便在pyqt5中运行它。

代码语言:javascript
运行
复制
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

这是为该代码导入的所有库

代码语言:javascript
运行
复制
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()

请查看这里的完整代码,全码

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-19 14:42:56

将PyQt4代码转换为PyQt5并不是一项简单的任务:

  • PyQt4和PyQt5分别是Qt4和Qt5的包装器,因此两者都受到这种转换变化的影响,其中之一是Qt4的QtGui子模块被划分为Qt5的QtGui和QtWidgets子模块。
  • 有些类和方法是不推荐的,所以如果它存在,就必须找到等效的类和方法。

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

并观察到QT += widgets中表示它属于QtWidgets子模块的部分.

但是第二种情况要复杂一些,因为它涉及到寻找可能在同一类中的或可能不在同一类中的等效类,在这种情况下,它会发生在QPixmap.grabWindow()方法中,该方法被弃用(请看这里获得更多信息)。在进行搜索之后,可以用QApplication.primaryScreen().grabWindow(0)替换该代码。

考虑到所有这些,翻译如下:

代码语言:javascript
运行
复制
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_())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60759000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档