PyQt4应用程序在Windows和Ubuntu上的运行方式不同

时间:2018-06-11 18:59:59

标签: python linux windows qt cross-platform

我使用PyQt4 ob ubuntu开发了一个应用程序,但它在Windows上的工作方式不同。具体来说,我的方法RubberbandEnhancedLabelMultiple没有我实现的任何方法,并显示为半透明的蓝色矩形,这不是我想要的。我该如何解决这个问题?

class RubberbandEnhancedLabelMultiple(QtGui.QLabel):
    def __init__(self, parent=None):
        self.max_bboxes = 10
        QtGui.QLabel.__init__(self, parent)
        self.selections = []#[QtGui.QRubberBand(QtGui.QRubberBand.Rectangle, self) for i in range(self.max_bboxes)]
        self.active_bboxes = 0
        # for s in self.selections:
        #     s.hide()
        self.upper_left = []#[QtCore.QPoint() for i in range(self.max_bboxes)]
        self.lower_right = []#[QtCore.QPoint() for i in range(self.max_bboxes)]
        self.mode = []#[" " for i in range(self.max_bboxes)]
        self.category = []#[0]*self.max_bboxes
        self.reg = 0
        self.color = QtGui.QColor('red')#QtGui.QPalette(QtGui.QColor('red'))
        #self.color.setBrush(QtGui.QPalette.Foreground, QtGui.QBrush(QtGui.QColor('red')))
        #self.color.setBrush(QtGui.QPalette.Base, QtGui.QBrush(QtGui.QColor('red')))
        self.curr_id = 0
        self.id = []
        self._pixmap = QPixmap(self.width(), self.height())


    def change_color(self, i):
        d = {0:QtGui.QColor('red'), 1:QtGui.QColor('blue'), 2:QtGui.QColor('green'), 3:QtGui.QColor('black')}
        self.color = QtGui.QColor(d[i])

        self.reg = i


    def mousePressEvent(self, event):
        '''
            Mouse is pressed. If selection is visible either set dragging mode (if close to border) or hide selection.
            If selection is not visible make it visible and start at this point.
        '''
        # self.setPixmap(self._pixmap)
        # self.update()
        if event.button() == QtCore.Qt.LeftButton:
            #self.mode = [" " for i in range(self.max_bboxes)]
            print ("press")
            i = 0
            fl = 0
            min_i = 0
            min_sh = 10000
            string = "saaaas"
            position = QtCore.QPoint(event.pos())
            for sel in self.selections:
                if sel.isVisible():
                    # visible selection
                    if (self.upper_left[i] - position).manhattanLength() < min_sh:
                        # close to upper left corner, drag it
                        fl = 1
                        #self.mode[i] = "drag_upper_left"
                        min_sh = (self.upper_left[i] - position).manhattanLength()
                        min_i = i
                        string = "drag_upper_left"
                    if (self.lower_right[i] - position).manhattanLength() < min_sh:
                        # close to lower right corner, drag it
                        #self.mode[i] = "drag_lower_right"
                        min_sh = (self.lower_right[i] - position).manhattanLength()
                        min_i = i
                        string =  "drag_lower_right"
                        fl = 1
                i += 1
                    # else:
                    #     # clicked somewhere else, hide selection
                    #     #self.selection.hide()
                    #     self.selections[i].show()

                    #     pass
                print ('loop 1')

            if min_sh < 10:

                self.mode[min_i] = string

            else:
                # no visible selection, start new selection
                print (len(self.selections))

                self.selections.append(QtGui.QRubberBand(QtGui.QRubberBand.Rectangle, self))
                self.category.append(self.reg)
                self.upper_left.append(position)
                self.lower_right.append(position)
                self.mode.append("drag_lower_right")
                self.selections[-1].setGeometry(QtCore.QRect(self.upper_left[-1], self.lower_right[-1]).normalized())
                #self.color.setBrush(QtGui.QColor(255,0,0))
                # self.selections[-1].setPalette(self.color)

                #self.selections[-1].setStyle(QtGui.QStyleFactory.create('windowsvista'))
                self.selections[-1].show()
                self.id.append(self.curr_id)
                if self.reg != 3:
                    self.curr_id += 1
                # self.upper_left[self.active_bboxes] = position
                # self.lower_right[self.active_bboxes] = position
                # self.mode[self.active_bboxes] = "drag_lower_right"
                # self.selections[self.active_bboxes].show()

                #print (self.active_bboxes, self.selections[self.active_bboxes].isVisible())
                self.active_bboxes += 1
                print ("new", self.active_bboxes, self.id[-1])


    def mouseMoveEvent(self, event):
        '''
            Mouse moved. If selection is visible, drag it according to drag mode.
        '''
        #print ("MouseMove")
        for i in range(self.active_bboxes):
            if self.selections[i].isVisible():
                # visible selection
                if self.mode[i] == "drag_lower_right":
                    self.lower_right[i] = QtCore.QPoint(event.pos())


                elif self.mode[i] == "drag_upper_left":
                    self.upper_left[i] = QtCore.QPoint(event.pos())
                # update geometry
                self.selections[i].setGeometry(QtCore.QRect(self.upper_left[i], self.lower_right[i]).normalized())

                # painter = QtGui.QPainter()
                # painter.begin(self)
                # pen = QtGui.QPen(QtCore.Qt.black, 2, QtCore.Qt.DashDotDotLine)
                # painter.setPen(pen)                # painter.drawRect(self.upper_left[i].x(), self.upper_left[i].y(), self.selections[i].height(), self.selections[i].width())

    def mouseReleaseEvent(self, event):
        print ("ReleaseMouse")
       # pass
        self.mode = [" " for i in range(len(self.mode))]

        if self.upper_left[-1].x() == self.lower_right[-1].x() or self.upper_left[-1].y() == self.lower_right[-1].y():
            print ('remove')
            self.selections[-1].hide()
            self.selections = self.selections[:-1]
            self.active_bboxes -= 1
            self.upper_left = self.upper_left[:-1]
            self.lower_right = self.lower_right[:-1]
            self.curr_id -= 1
            self.id = self.id[:-1]
            self.mode = self.mode[:-1]
        # if self.selections[self.active_bboxes-1].width() == 0 and self.selections[self.active_bboxes-1].width() == 0 :
        #     self.selections[self.active_bboxes-1].hide()
        #     self.active_bboxes -= 1

    def paintEvent(self, event):
        super(RubberbandEnhancedLabelMultiple, self).paintEvent(event)
        qp = QtGui.QPainter()
        qp.begin(self)
        qp.setOpacity(0.5)
        d = {0:QtGui.QColor('red'), 1:QtGui.QColor('blue'), 2:QtGui.QColor('green'), 3:QtGui.QColor('black')}

        for i in range(len(self.selections)):
            brush = QtGui.QBrush(QtCore.Qt.SolidPattern)

            brush.setColor(d[self.category[i]])
            #qp.setPen(QColor("black"))
            qp.setFont(QFont("Arial", 20, 20))
            qp.setOpacity(1)
            pen = QPen()
            pen.setColor(d[self.category[i]])
            pen.setWidth(5)
            qp.setPen(pen)

            qp.drawText(self.upper_left[i].x(), self.upper_left[i].y(), QString(str(self.id[i])))
            brush.setColor(d[self.category[i]])
            #qp.setBrush(brush)
            qp.setOpacity(1)

            qp.drawRect(self.upper_left[i].x(), self.upper_left[i].y(), self.selections[i].width(),
                    self.selections[i].height())

        self.update()
        qp.end()

    def reset_selected(self):
        for sel in self.selections:
            sel.hide()

        self.selections = [] #[QtGui.QRubberBand(QtGui.QRubberBand.Rectangle, self) for i in range(self.max_bboxes)]
        self.active_bboxes = 0
        self.upper_left = []#[QtCore.QPoint() for i in range(self.max_bboxes)]
        self.lower_right = []#[QtCore.QPoint() for i in range(self.max_bboxes)]
        self.mode = []#[" " for i in range(self.max_bboxes)]

    def keyPressEvent(self, event):
        print ("key")
        if event.key()==(QtCore.Qt.Key_Backspace):
            print ('ctrl z')
            self.selections[self.active_bboxes].hide()
            self.active_bboxes -= 1

0 个答案:

没有答案