TableView 在脚本运行 PyQt 时不显示

时间:2021-06-14 08:43:42

标签: python pyqt5

我想将数据从数据框中加载到表格视图中。 然后我想在我的 TableView UI 上展示它。

但我随机得到一个:QPaintDevice:无法破坏正在绘制的绘制设备

我没有 QPainter 对象,所以我无法结束它。

编辑:有时在我滚动 TableView 时会发生 dataframe_orders 是我从我的数据库中提取的数据帧。 并且通过的检查顺序只是一个更新数据库上的东西的函数。 他们在我使用 tkinter 的另一个代码上正常工作。 当我离开窗口时,我试图销毁表视图对象和模型(它是一个辅助窗口,所以要回到主窗口)

我添加了 PandasModel,它基本上是我用来在 tableview 上设置数据框的模型

这是我的代码:


class PandasModel(QtCore.QAbstractTableModel):
    def __init__(self, df = pd.DataFrame(), parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent=parent)
        self._df = df.copy()

    def toDataFrame(self):
        return self._df.copy()

    def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
        if role != QtCore.Qt.DisplayRole:
            return QtCore.QVariant()

        if orientation == QtCore.Qt.Horizontal:
            try:
                return self._df.columns.tolist()[section]
            except (IndexError, ):
                return QtCore.QVariant()
        elif orientation == QtCore.Qt.Vertical:
            try:
                # return self.df.index.tolist()
                return self._df.index.tolist()[section]
            except (IndexError, ):
                return QtCore.QVariant()

    def data(self, index, role=QtCore.Qt.DisplayRole):
        if role != QtCore.Qt.DisplayRole:
            return QtCore.QVariant()

        if not index.isValid():
            return QtCore.QVariant()

        return QtCore.QVariant(str(self._df.iloc[index.row(), index.column()]))

    def setData(self, index, value, role):
        row = self._df.index[index.row()]
        col = self._df.columns[index.column()]
        if hasattr(value, 'toPyObject'):
            # PyQt4 gets a QVariant
            value = value.toPyObject()
        else:
            # PySide gets an unicode
            dtype = self._df[col].dtype
            if dtype != object:
                value = None if value == '' else dtype.type(value)
        self._df.set_value(row, col, value)
        return True

    def rowCount(self, parent=QtCore.QModelIndex()):
        return len(self._df.index)

    def columnCount(self, parent=QtCore.QModelIndex()):
        return len(self._df.columns)

    def sort(self, column, order):
        colname = self._df.columns.tolist()[column]
        self.layoutAboutToBeChanged.emit()
        self._df.sort_values(colname, ascending= order == QtCore.Qt.AscendingOrder, inplace=True)
        self._df.reset_index(inplace=True, drop=True)
        self.layoutChanged.emit()

class Ui_OrderWindow(object):
    def setupUi(self, OrderWindow):
        OrderWindow.setObjectName("OrderWindow")
        OrderWindow.resize(1919, 600)
        self.centralwidgetorders = QtWidgets.QWidget(OrderWindow)
        self.centralwidgetorders.setObjectName("centralwidgetorders")
        self.fenetreorders = QtWidgets.QFrame(self.centralwidgetorders)
        self.fenetreorders.setGeometry(QtCore.QRect(10, 10, 1891, 551))
        self.fenetreorders.setStyleSheet("QFrame{\n"
"border-radius:20px;\n"
"background-color: rgb(255, 255, 255);\n"
"}")
        self.fenetreorders.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.fenetreorders.setFrameShadow(QtWidgets.QFrame.Raised)
        self.fenetreorders.setObjectName("fenetreorders")
        self.titreorders = QtWidgets.QLabel(self.fenetreorders)
        self.titreorders.setGeometry(QtCore.QRect(880, 50, 151, 41))
        font = QtGui.QFont()
        font.setFamily("Dubai")
        font.setPointSize(18)
        font.setBold(True)
        font.setWeight(75)
        self.titreorders.setFont(font)
        self.titreorders.setStyleSheet("color: rgb(18, 0, 124)")
        self.titreorders.setObjectName("titreorders")
        self.generatemailorders = QtWidgets.QPushButton(self.fenetreorders)
        self.generatemailorders.setGeometry(QtCore.QRect(890, 500, 121, 31))
        font = QtGui.QFont()
        font.setFamily("Dubai")
        font.setPointSize(13)
        font.setBold(False)
        font.setWeight(50)
        self.generatemailorders.setFont(font)
        self.generatemailorders.setStyleSheet("QPushButton{\n"
"background-color:  rgb(18, 0, 124);\n"
"color: rgb(239, 239, 239);\n"
"border-radius: 8px;\n"
"\n"
"}\n"
"\n"
"QPushButton:hover{\n"
"background-color:rgb(21, 0, 166);\n"
"color: rgb(239, 239, 239);\n"
"border-radius: 8px;\n"
"\n"
"}")
        self.generatemailorders.setObjectName("generatemailorders")
        self.tableVieworders = QtWidgets.QTableView(self.fenetreorders)
        self.tableVieworders.setGeometry(QtCore.QRect(20, 100, 1851, 371))
        self.tableVieworders.setStyleSheet("background-color: rgb(239, 239, 239);\n"
"border-radius:0px;\n"
"")
        self.tableVieworders.setObjectName("tableVieworders")
        self.btnretour = QtWidgets.QPushButton(self.fenetreorders)
        self.btnretour.setGeometry(QtCore.QRect(20, 50, 41, 41))
        self.btnretour.setStyleSheet("QPushButton {    \n"
"    border: none;\n"
"    background-color: transparent;\n"
"    \n"
"}\n"
"QPushButton:hover {\n"
"     border: none;\n"
"    border-radius:0px;\n"
"    \n"
"    \n"
"    background-color: qlineargradient(spread:pad, x1:0.482759, y1:0, x2:0.517241, y2:0.977273, stop:0 rgba(238, 238, 238, 255), stop:1 rgba(238, 238, 238, 255))\n"
"}\n"
"QPushButton:pressed {    \n"
"    background-color: rgb(85, 170, 255);\n"
"}")
        self.btnretour.setText("")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("left-arrow-icon-7.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.btnretour.setIcon(icon)
        self.btnretour.setIconSize(QtCore.QSize(32, 32))
        self.btnretour.setObjectName("btnretour")
        self.titlezone = QtWidgets.QWidget(self.centralwidgetorders)
        self.titlezone.setGeometry(QtCore.QRect(10, 10, 1891, 41))
        self.titlezone.setStyleSheet("background-color: rgb(18, 0, 124);\n"
"border-top-left-radius:20px;\n"
"border-top-right-radius:20px;")
        self.titlezone.setObjectName("titlezone")
        self.titlewindow = QtWidgets.QLabel(self.titlezone)
        self.titlewindow.setGeometry(QtCore.QRect(40, 0, 101, 41))
        font = QtGui.QFont()
        font.setFamily("Dubai")
        font.setPointSize(13)
        self.titlewindow.setFont(font)
        self.titlewindow.setStyleSheet("color: rgb(239, 239, 239);")
        self.titlewindow.setObjectName("titlewindow")
        self.framebtn = QtWidgets.QFrame(self.centralwidgetorders)
        self.framebtn.setGeometry(QtCore.QRect(1790, 10, 101, 41))
        self.framebtn.setStyleSheet("background-color: rgb(18, 0,124);\n"
"border-radius:20px;")
        self.framebtn.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.framebtn.setFrameShadow(QtWidgets.QFrame.Raised)
        self.framebtn.setObjectName("framebtn")
        self.btnminimize = QtWidgets.QPushButton(self.framebtn)
        self.btnminimize.setGeometry(QtCore.QRect(10, 1, 40, 41))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.btnminimize.sizePolicy().hasHeightForWidth())
        self.btnminimize.setSizePolicy(sizePolicy)
        self.btnminimize.setMinimumSize(QtCore.QSize(40, 0))
        self.btnminimize.setMaximumSize(QtCore.QSize(40, 16777215))
        self.btnminimize.setStyleSheet("QPushButton {    \n"
"    border: none;\n"
"    background-color: transparent;\n"
"    \n"
"}\n"
"QPushButton:hover {\n"
"     border: none;\n"
"    border-radius:0px;\n"
"    \n"
"    \n"
"    background-color: rgb(16, 1, 108);\n"
"}\n"
"QPushButton:pressed {    \n"
"    background-color: rgb(85, 170, 255);\n"
"}")
        self.btnminimize.setText("")
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("minimizeicon-removebg-preview.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.btnminimize.setIcon(icon1)
        self.btnminimize.setObjectName("btnminimize")
        self.btnclose = QtWidgets.QPushButton(self.framebtn)
        self.btnclose.setGeometry(QtCore.QRect(50, 0, 40, 41))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.btnclose.sizePolicy().hasHeightForWidth())
        self.btnclose.setSizePolicy(sizePolicy)
        self.btnclose.setMinimumSize(QtCore.QSize(40, 0))
        self.btnclose.setMaximumSize(QtCore.QSize(40, 16777215))
        self.btnclose.setStyleSheet("QPushButton {    \n"
"    border: none;\n"
"    background-color: transparent;\n"
"    \n"
"}\n"
"QPushButton:hover {\n"
"     border: none;\n"
"    border-radius:0px;\n"
"    \n"
"    \n"
"    background-color: rgb(16, 1, 108);\n"
"}\n"
"QPushButton:pressed {    \n"
"    background-color: rgb(85, 170, 255);\n"
"}")
        self.btnclose.setText("")
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("cil-x.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.btnclose.setIcon(icon2)
        self.btnclose.setObjectName("btnclose")
        OrderWindow.setCentralWidget(self.centralwidgetorders)
        self.statusbar = QtWidgets.QStatusBar(OrderWindow)
        self.statusbar.setObjectName("statusbar")
        OrderWindow.setStatusBar(self.statusbar)

        self.retranslateUi(OrderWindow)
        QtCore.QMetaObject.connectSlotsByName(OrderWindow)

    def retranslateUi(self, OrderWindow):
        _translate = QtCore.QCoreApplication.translate
        OrderWindow.setWindowTitle(_translate("OrderWindow", "MainWindow"))
        self.titreorders.setText(_translate("OrderWindow", "Orders Found"))
        self.generatemailorders.setText(_translate("OrderWindow", "Generate Mail"))
        self.titlewindow.setText(_translate("OrderWindow", "AutoTrade"))
        self.btnminimize.setToolTip(_translate("OrderWindow", "Minimize"))
        self.btnclose.setToolTip(_translate("OrderWindow", "Minimize"))
class OrderWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_OrderWindow()

        self.ui.setupUi(self)
        self.setWindowFlag(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        # MINIMIZE
        self.ui.btnminimize.clicked.connect(lambda: self.showMinimized())

        # CLOSE
        self.ui.btnclose.clicked.connect(lambda: self.close_order())

        self.model = PandasModel(dataframe_orders)
        self.ui.tableVieworders.setModel(self.model)
       
            self.ui.tableVieworders.show()
            print(self.ui.tableVieworders.__dict__)
            self.ui.generatemailorders.clicked.connect(lambda: self.runmailorders())


            self.ui.btnretour.clicked.connect(lambda: self.retour_main())
            def moveWindow(event):


                # IF LEFT CLICK MOVE WINDOW
                if event.buttons() == Qt.LeftButton:
                    self.move(self.pos() + event.globalPos() - self.dragPos)
                    self.dragPos = event.globalPos()
                    event.accept()

            self.setFixedSize(self.size())
            print(vars(self.ui.tableVieworders))

            ## SHOW ==> MAIN WINDOW
            ########################################################################
            self.show()


    def retour_main(self):
        del self.model
        self.ui.tableVieworders.destroy()
        MainWindow()
        self.destroy()

    def close_order(self):
        del self.model
        self.ui.tableVieworders.destroy()
        MainWindow()
        self.destroy()

    def runmailorders(self):
        check_order_passe()
        del self.model
        self.ui.tableVieworders.destroy()
        self.close()
    def mousePressEvent(self, event):
        self.dragPos = event.globalPos()

0 个答案:

没有答案