猿问

获取自定义 Qt QGraphicsView 以使用 Qt Designer 制作的表单显示

我将一个自定义 QGraphicsView 放在一起,我可以在 Python 的主窗口中显示它,但我正在努力将它集成到我用 Qt Designer 制作的表单中。我如何将它添加到表单中?


另外,我还添加了一个 mousepress 事件。如何使用 Qt Designer 制作的表单将其集成到应用程序中?我已经使用 Qt Designer 构建了一个完整的应用程序,其他一切正常,我只需要能够将这部分与其余部分添加在一起。


import sys

from PySide2 import QtCore, QtGui, QtWidgets

from PyQt5.QtWidgets import QFileDialog

from PySide2.QtUiTools import QUiLoader

from PySide2.QtWidgets import QApplication, QPushButton, QLineEdit, QAction, QSlider

from PySide2.QtWidgets import QListWidget, QTabWidget, QGraphicsView, QGraphicsScene

from PySide2.QtWidgets import QSpinBox, QWidget, QDialog, QVBoxLayout

from PySide2.QtGui import QPixmap, QImage, QMatrix, QPainter, QColor, QMouseEvent, QCursor

from PySide2.QtCore import QFile, QObject, SIGNAL


import cv2

import numpy as np

import math


class Display_Pixels(QGraphicsView):


    def __init__(self, parent=None):

        QGraphicsView.__init__(self, parent=parent)

        #super().__init__()

        self.initUI()

        self.img = cv2.imread('roi.jpg')


    def initUI(self):      

        self.setGeometry(100, 100, 650, 650)

        #self.setWindowTitle('By Pixel')

        #self.setMouseTracking(True)

        #self.show()

        res = 40 

        self.grid = np.array([ [-1] * res  for n in range(res)]) # list comprehension

        #print(self.grid.shape)



    def paintEvent(self, e):

        qp = QPainter()

        qp.begin(self.viewport())

        self.drawRectangles(qp)

        qp.end()



    def drawRectangles(self, qp, w = 16):

        print("Drawing")

        mode = 0

        x,y = 0,0 # starting position

        lr = 20

        hr = 35

        col = QColor(0, 0, 0)

        col.setNamedColor('#d4d4d4')

        qp.setPen(col)

        #print(self.img.shape)

繁华开满天机
浏览 165回答 1
1回答

30秒到达战场

我认为您的意思是您成功将此代码添加到主窗口,但您希望能够将其添加到您在设计器中制作的小部件中,而不是严格意义上的主窗口。如果是这种情况,您想要做的是在 Qt Designer 中按照您想要的方式格式化您的小部件,在您想要插入 Display_Pixels QGraphicsView 对象的位置添加一个占位符,例如框架、布局、可能是一个组等。之后不会直接将其添加到框架中,而是将该框架使用的任何布局。所以如果你的框架中有一个网格布局,它会是这样的:&nbsp; &nbsp; self.Disp_pixel = Display_Pixels()&nbsp; &nbsp; widget_name.gridlayout.addWidget(self.Disp_pixel)很难告诉您这段代码将在您的代码中的何处实现,但假设您运行了 pyuic5 并获得了 python 输出。您可以将它添加到该输出 python 文件中。我建议使用类似查看器类的东西,它继承生成的输出类并在其中执行添加小部件。此外,frame 将是您为图形视图创建的框架的名称,而不是字面上的框架。此外,我不确定您是否可以在任何类型的小部件上进行展示,我很确定小部件必须是可显示的,例如主窗口小部件或对话框小部件。也就是说小部件可以放置在其他小部件中。这是我给你的一个例子,它有点粗糙,但我认为它会有所帮助:import sysimport cv2import numpy as npimport mathfrom PyQt5.QtGui import QPainter, QColorfrom PyQt5.QtWidgets import QGraphicsView, QApplication# -*- coding: utf-8 -*-# Form implementation generated from reading ui file '.\testUI.ui' and .\testMainWin.ui## Created by: PyQt5 UI code generator 5.9.2## WARNING! All changes made in this file will be lost!from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):&nbsp; &nbsp; def setupUi(self, MainWindow):&nbsp; &nbsp; &nbsp; &nbsp; MainWindow.setObjectName("MainWindow")&nbsp; &nbsp; &nbsp; &nbsp; MainWindow.resize(800, 600)&nbsp; &nbsp; &nbsp; &nbsp; self.centralwidget = QtWidgets.QWidget(MainWindow)&nbsp; &nbsp; &nbsp; &nbsp; self.centralwidget.setObjectName("centralwidget")&nbsp; &nbsp; &nbsp; &nbsp; self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)&nbsp; &nbsp; &nbsp; &nbsp; self.gridLayout.setObjectName("gridLayout")&nbsp; &nbsp; &nbsp; &nbsp; MainWindow.setCentralWidget(self.centralwidget)&nbsp; &nbsp; &nbsp; &nbsp; self.retranslateUi(MainWindow)&nbsp; &nbsp; &nbsp; &nbsp; QtCore.QMetaObject.connectSlotsByName(MainWindow)&nbsp; &nbsp; def retranslateUi(self, MainWindow):&nbsp; &nbsp; &nbsp; &nbsp; _translate = QtCore.QCoreApplication.translate&nbsp; &nbsp; &nbsp; &nbsp; MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))class Ui_Form(object):&nbsp; &nbsp; def setupUi(self, Form):&nbsp; &nbsp; &nbsp; &nbsp; Form.setObjectName("Form")&nbsp; &nbsp; &nbsp; &nbsp; Form.resize(400, 300)&nbsp; &nbsp; &nbsp; &nbsp; self.gridLayout = QtWidgets.QGridLayout(Form)&nbsp; &nbsp; &nbsp; &nbsp; self.gridLayout.setObjectName("gridLayout")&nbsp; &nbsp; &nbsp; &nbsp; self.frame = QtWidgets.QFrame(Form)&nbsp; &nbsp; &nbsp; &nbsp; self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)&nbsp; &nbsp; &nbsp; &nbsp; self.frame.setFrameShadow(QtWidgets.QFrame.Raised)&nbsp; &nbsp; &nbsp; &nbsp; self.frame.setObjectName("frame")&nbsp; &nbsp; &nbsp; &nbsp; self.gridLayout_2 = QtWidgets.QGridLayout(self.frame)&nbsp; &nbsp; &nbsp; &nbsp; self.gridLayout_2.setObjectName("gridLayout_2")&nbsp; &nbsp; &nbsp; &nbsp; self.gridLayout.addWidget(self.frame, 0, 0, 1, 1)&nbsp; &nbsp; &nbsp; &nbsp; self.retranslateUi(Form)&nbsp; &nbsp; &nbsp; &nbsp; QtCore.QMetaObject.connectSlotsByName(Form)&nbsp; &nbsp; def retranslateUi(self, Form):&nbsp; &nbsp; &nbsp; &nbsp; _translate = QtCore.QCoreApplication.translate&nbsp; &nbsp; &nbsp; &nbsp; Form.setWindowTitle(_translate("Form", "Form"))class FormView(QtWidgets.QWidget, Ui_Form):&nbsp; &nbsp; def __init__(self, parent=None):&nbsp; &nbsp; &nbsp; &nbsp; super(FormView, self).__init__(parent)&nbsp; &nbsp; &nbsp; &nbsp; self.setupUi(self)&nbsp; &nbsp; &nbsp; &nbsp; self.disp_pixels = Display_Pixels()&nbsp; &nbsp; &nbsp; &nbsp; self.gridLayout_2.addWidget(self.disp_pixels)class MainView(QtWidgets.QMainWindow, Ui_MainWindow):&nbsp; &nbsp; def __init__(self, parent=None):&nbsp; &nbsp; &nbsp; &nbsp; super(MainView, self).__init__(parent)&nbsp; &nbsp; &nbsp; &nbsp; self.setupUi(self)class Display_Pixels(QGraphicsView):&nbsp; &nbsp; def __init__(self, parent=None):&nbsp; &nbsp; &nbsp; &nbsp; QGraphicsView.__init__(self, parent=parent)&nbsp; &nbsp; &nbsp; &nbsp; #super().__init__()&nbsp; &nbsp; &nbsp; &nbsp; self.initUI()&nbsp; &nbsp; &nbsp; &nbsp; self.img = cv2.imread('resources/images/pic3.jpg')&nbsp; &nbsp; def initUI(self):&nbsp; &nbsp; &nbsp; &nbsp; self.setGeometry(100, 100, 650, 650)&nbsp; &nbsp; &nbsp; &nbsp; #self.setWindowTitle('By Pixel')&nbsp; &nbsp; &nbsp; &nbsp; #self.setMouseTracking(True)&nbsp; &nbsp; &nbsp; &nbsp; #self.show()&nbsp; &nbsp; &nbsp; &nbsp; res = 40&nbsp; &nbsp; &nbsp; &nbsp; self.grid = np.array([ [-1] * res&nbsp; for n in range(res)]) # list comprehension&nbsp; &nbsp; &nbsp; &nbsp; #print(self.grid.shape)&nbsp; &nbsp; def paintEvent(self, e):&nbsp; &nbsp; &nbsp; &nbsp; qp = QPainter()&nbsp; &nbsp; &nbsp; &nbsp; qp.begin(self.viewport())&nbsp; &nbsp; &nbsp; &nbsp; self.drawRectangles(qp)&nbsp; &nbsp; &nbsp; &nbsp; qp.end()&nbsp; &nbsp; def drawRectangles(self, qp, w = 16):&nbsp; &nbsp; &nbsp; &nbsp; print("Drawing")&nbsp; &nbsp; &nbsp; &nbsp; mode = 0&nbsp; &nbsp; &nbsp; &nbsp; x,y = 0,0 # starting position&nbsp; &nbsp; &nbsp; &nbsp; lr = 20&nbsp; &nbsp; &nbsp; &nbsp; hr = 35&nbsp; &nbsp; &nbsp; &nbsp; col = QColor(0, 0, 0)&nbsp; &nbsp; &nbsp; &nbsp; col.setNamedColor('#d4d4d4')&nbsp; &nbsp; &nbsp; &nbsp; qp.setPen(col)&nbsp; &nbsp; &nbsp; &nbsp; #print(self.img.shape)&nbsp; &nbsp; &nbsp; &nbsp; for g_row, img_row in zip(self.grid, self.img):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #print(img_row.shape)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for g_col, img_col in zip(g_row, img_row):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r, g, b = (img_col[0], img_col[1], img_col[2])&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #print(r,g,b)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if g_col == 1:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if mode == 0:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r = int(math.log(r+1)*lr)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; g = int(math.log(g+1)*hr)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b = int(math.log(b+1)*lr)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elif mode == 1:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if r+50 <= 220: r = r+50&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if g+80 <= 255: g = g+80&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if b+50 <= 220: b = b+50&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if r+70 <= 220: r = r+70&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if g+140 <= 255: g = g+140&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if b+70 <= 220: b = b+70&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; qp.setBrush(QColor(r, g, b))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; qp.drawRect(x, y, w, w)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; qp.setBrush(QColor(r, g, b))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; qp.drawRect(x, y, w, w)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #qp.setBrush(QColor(200, 0, 0))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #qp.drawRect(x, y, w, w)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x = x + w&nbsp; # move right&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y = y + w # move down&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x = 0 # rest to left edge&nbsp; &nbsp; def mousePressEvent(self, QMouseEvent):&nbsp; &nbsp; &nbsp; &nbsp; w = 16.0&nbsp; &nbsp; &nbsp; &nbsp; #print("MOUSE:")&nbsp; &nbsp; &nbsp; &nbsp; #print('(', int(QMouseEvent.x()/w), ', ', int(QMouseEvent.y()/w), ')')&nbsp; &nbsp; &nbsp; &nbsp; #print (QMouseEvent.pos())&nbsp; &nbsp; &nbsp; &nbsp; x = float(QMouseEvent.x())&nbsp; &nbsp; &nbsp; &nbsp; y = float(QMouseEvent.y())&nbsp; &nbsp; &nbsp; &nbsp; self.grid[int(y/w)][int(x/w)] = -1 * self.grid[int(y/w)][int(x/w)]&nbsp; &nbsp; &nbsp; &nbsp; #print(img[int(y/w), int(x/w), :])&nbsp; &nbsp; &nbsp; &nbsp; self.repaint()&nbsp; &nbsp; &nbsp; &nbsp; #self.update()if __name__ == '__main__':&nbsp; &nbsp; app = QApplication.instance()&nbsp; &nbsp; if app is None:&nbsp; &nbsp; &nbsp; &nbsp; app = QApplication(sys.argv)&nbsp; &nbsp; main_window = MainView()&nbsp; &nbsp; form = FormView()&nbsp; &nbsp; main_window.gridLayout.addWidget(form)&nbsp; &nbsp; main_window.show()&nbsp; &nbsp; sys.exit(app.exec_())
随时随地看视频慕课网APP

相关分类

Python
我要回答