python - 如何在python中从pyqt4升级到pyqt5
问题描述
我想将此代码从 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_())
推荐阅读
- php - 在 Laravel 中查看如何对 URL 进行 json_decode
- http - HttpContext.Current.Request.Browser.MajorVersion 将 IE11 显示为 IE7
- html - 无法垂直居中 Bootstrap 3 媒体
- c++ - #SQLite This query statement does not work as I thought. What should I do
- android - Progress dialog in Multipart Upload Request
- java - Problem to insert new user to DB after checking if email exist sqlite
- c# - 当另一个窗体关闭时以一个窗体执行代码
- c++ - Passing object from another class to a constructor of the other in C++?
- sql - In a reversely linked list, how to get a sublist of it efficiently?
- sugarcrm - 元数据和 vardefs 之间的主要区别