凌的博客

您现在的位置是: 首页 > 学无止境 > python > 

python

PyQt5 模拟镜头

2019-10-06 python 1771
import sys
from PyQt5.QtWidgets import QWidget, QApplication, QDesktopWidget
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QPainter, QColor, QPen, QCursor, QFont, QBrush


class RectPos:
    x1 = 0
    y1 = 0
    x2 = 0
    y2 = 0


class Rect(QWidget):
    __dragWin = False

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):

        self.setMouseTracking(True)  # 保证得到鼠标信息

        # pyqt5设置窗体透明控件不透明
        # self.setAttribute(Qt.WA_TranslucentBackground)
        self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint | Qt.Tool)  #
        self.setWindowOpacity(.8)

        self.time = 0
        self.timer = QTimer()
        self.timer.setInterval(10)
        self.timer.timeout.connect(self.update)
        self.timer.start()

        self.rect = RectPos()

        self.setGeometry(300, 300, 500, 400)
        self.setWindowTitle("绘画")
        self.center()

    def paintEvent(self, ev):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)  ## 抗锯齿
        # painter.save()
        pen = QPen(QColor(166, 66, 250), 1, Qt.SolidLine)
        painter.setPen(pen)
        painter.drawRect(0, 0, self.width(), self.height())

        w = self.width()
        h = self.height()
        space = 30

        # 镜头 线条
        painter.drawLine(space, space, space * 2, space)
        painter.drawLine(space, space, space, space * 2)

        painter.drawLine(w - space * 2, space, w - space, space)
        painter.drawLine(w - space, space, w - space, space * 2)

        painter.drawLine(space, h - space * 2, space, h - space)
        painter.drawLine(space, h - space, space * 2, h - space)
        painter.drawLine(w - space, h - space * 2, w - space, h - space)
        painter.drawLine(w - space, h - space, w - space * 2, h - space)

        brush = QBrush(Qt.SolidPattern)
        brush.setColor(QColor("#0000ff"))
        painter.setBrush(brush)
        painter.drawEllipse(w - 65, 85, 10, 10)
        painter.setFont(QFont("SimSun", 24))
        painter.drawText(w - 120, 100, "REC")

        painter.setFont(QFont("SimSun", 16))
        painter.drawText(w / 2 - 130, h / 2,
                         "pos:(%d,%d,%d,%d)" % (self.x(), self.y(), self.x() + self.width(), self.y() + self.height()))

        painter.drawText(w / 2 - 70, h - 50, "双击获取坐标")

    def mousePressEvent(self, e):
        self.__dragWin = True
        self.__dragWin_x = e.x()
        self.__dragWin_y = e.y()

        self.rect.x1 = self.x()
        self.rect.y1 = self.y()
        self.rect.x2 = self.x() + self.width()
        self.rect.y2 = self.y() + self.height()

        self.setCursor(QCursor(Qt.SizeAllCursor))  # 更改鼠标图标

    def mouseMoveEvent(self, e):
        pos = e.globalPos()
        x = e.x()
        y = e.y()

        space = 20
        if x < space and y < space:
            self.setCursor(QCursor(Qt.CrossCursor))  # 更改鼠标图标
            if self.__dragWin == True:
                if abs(self.rect.x2 - self.x()) > 0 and abs(self.rect.y2 - self.y()) > 0:
                    self.setGeometry(pos.x(), pos.y(), abs(self.rect.x2 - self.x()), abs(self.rect.y2 - self.y()))
        elif x > self.width() - space and y < space:
            self.setCursor(QCursor(Qt.CrossCursor))  # 更改鼠标图标
            if self.__dragWin == True:
                if x > 0 and abs(self.rect.y2 - self.y()) > 0:
                    self.setGeometry(self.x(), pos.y(), x, abs(self.rect.y2 - self.y()))
        elif x < space and y > self.height() - space:  # 左下角
            self.setCursor(QCursor(Qt.CrossCursor))  # 更改鼠标图标
            if self.__dragWin == True:
                if abs(self.rect.x2 - self.x()) > 0 and abs(pos.y() - self.rect.y1) > 0:
                    self.setGeometry(pos.x(), self.y(), abs(self.rect.x2 - self.x()), abs(pos.y() - self.rect.y1))
        elif x > self.width() - space and y > self.height() - space:
            self.setCursor(QCursor(Qt.CrossCursor))  # 更改鼠标图标
            if self.__dragWin == True:
                if x > 0 and abs(pos.y() - self.y()) > 0:
                    self.setGeometry(self.x(), self.y(), x, abs(pos.y() - self.y()))
        elif x < space:
            self.setCursor(QCursor(Qt.SizeHorCursor))  # 更改鼠标图标
            if self.__dragWin == True:
                if abs(self.rect.x2 - pos.x()) > 0:
                    self.setGeometry(pos.x(), self.y(), abs(self.rect.x2 - pos.x()), self.height())
        elif x > self.width() - space:
            self.setCursor(QCursor(Qt.SizeHorCursor))  # 更改鼠标图标
            if self.__dragWin == True:
                if x > 0:
                    self.setGeometry(self.x(), self.y(), x, self.height())
        elif y < space:
            self.setCursor(QCursor(Qt.SizeVerCursor))  # 更改鼠标图标
            if self.__dragWin == True:
                if abs(self.rect.y2 - pos.y()) > 0:
                    self.setGeometry(self.x(), pos.y(), self.width(), abs(self.rect.y2 - pos.y()))
        elif y > self.height() - space:
            self.setCursor(QCursor(Qt.SizeVerCursor))  # 更改鼠标图标
            if self.__dragWin == True:
                if abs(pos.y() - self.y()):
                    self.setGeometry(self.x(), self.y(), self.width(), abs(pos.y() - self.y()))
        else:
            self.setCursor(QCursor(Qt.SizeAllCursor))  # 更改鼠标图标
            if self.__dragWin == True:
                self.move(pos.x() - self.__dragWin_x, pos.y() - self.__dragWin_y)

    def mouseReleaseEvent(self, e):
        self.__dragWin = False
        self.setCursor(QCursor(Qt.ArrowCursor))

    def mouseDoubleClickEvent(self, e):
        print((self.x(), self.y(), self.x() + self.width(), self.y() + self.height()))
        QApplication.instance().exit()
        sys.exit(0)

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())


if __name__ == "__main__":
    app = QApplication(sys.argv)
    line = Rect()
    line.show()
    sys.exit(app.exec_())

QQ截图20191006001809.png

文章评论

0条评论