Beispiel #1
0
        tb.setObjectName(tb_name)
        tb.setWindowTitle("My Toolbar")
        iface.mainWindow().addToolBarBreak()  #toolbar in new line
        iface.addToolBar(tb)
    else:
        tb.clear()
    #add actions to tb
    actionsList = [
        "MyAPp:", "mActionSaveProject", "|", "mActionZoomIn", "mActionZoomOut",
        ["mActionMeasure", "mActionMeasureAngle", "mActionMeasureArea"]
    ]
    for a in actionsList:
        addAction(tb, a)
    #add a hide button
    btnObjectName = 'mClose_' + tb_name
    btn = tb.findChild(QPushButton, btnObjectName)
    if btn is None:
        btnHide = QPushButton()
        btnHide.setObjectName(btnObjectName)
        btnHide.setMaximumWidth(15)
        btnHide.setToolTip('close')
        btnHide.clicked.connect(lambda: tb.setHidden(True))
        #spacer
        spacer = QWidget()
        spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        tb.addWidget(spacer)
        tb.addWidget(btnHide)
    tb.show()
except Exception as e:
    info(e)
Beispiel #2
0
class DbTableWidget(QWidget):
    def __init__(self,
                 parent=None,
                 host=None,
                 port=0,
                 user='******',
                 passwd=None,
                 db=None,
                 charset='utf8',
                 tableName="",
                 **kwargs):
        super().__init__(parent, **kwargs)
        self.host = host
        self.port = port
        self.db = db
        self.user = user
        self.passwd = passwd
        self.charset = charset
        self.tableName = tableName

        mainLayout = VBoxLayout(self)

        self.toolBar = QToolBar()
        self.initToolBar()
        self.table = QTableWidget()
        self.pageTool = PageTool()

        mainLayout.addWidget(self.toolBar)
        mainLayout.addWidget(self.table)
        mainLayout.addWidget(self.pageTool)

        self.table.horizontalHeader().setStyleSheet(
            "QHeaderView::section{background:#F3F3F3;}")
        self.table.setStyleSheet("QTableWidget{border:0 none;//最外层边框}")
        self.table.verticalHeader().setVisible(False)  # 隐藏行号
        self.table.setAlternatingRowColors(True)  # 隔行换色
        # 设置可以自适应宽度
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        self.registerSignalConnect()

    def loadData(self):
        self.loadTable()

    def initToolBar(self):
        exportButton = QToolButton()
        exportButton.setText("导出")
        exportButton.setObjectName("exportButton")
        exportButton.setIcon(QIcon('icon/export.png'))
        exportButton.setIconSize(QSize(24, 24))
        exportButton.setAutoRaise(True)
        exportButton.setToolButtonStyle(
            Qt.ToolButtonTextBesideIcon)  #文字显示在图标旁边

        self.toolBar.addWidget(exportButton)

    def registerSignalConnect(self):
        self.pageTool.query.connect(self.loadTable)
        #通过name查找元素
        self.toolBar.findChild(QToolButton, "exportButton").clicked.connect(
            self.tableExport)
        #Qt.CustomContextMenu:用户自定义菜单,需绑定事件 customContextMenuRequested,并实现 槽函数
        self.table.setContextMenuPolicy(Qt.CustomContextMenu)
        self.table.customContextMenuRequested.connect(
            self.tableContextMenuEvent)

    def contextMenuEvent(self, event):
        """
        Qt.DefaultContextMenu	默认菜单,重写 contextMenuEvent() 实现自定义
        """
        pass

    def tableContextMenuEvent(self, event):
        #当前行的行号
        currentRow = self.table.currentRow()
        # 所有选中item的行号
        itemSelectedRows = [r.row() for r in self.table.selectedIndexes()]
        selections = self.table.selectionModel()
        # 所有选中行的行号
        selectedRows = [r.row() for r in selections.selectedRows()]

        pmenu = QMenu(self)
        downloadAct = QAction("删除", pmenu)
        pmenu.addAction(downloadAct)
        downloadAct.triggered.connect(lambda: print(selectedRows))
        # pmenu.popup(self.table.mapToGlobal(pos))
        pmenu.popup(QCursor.pos())

    def tableExport(self):
        exportDialog = SqlTableExportDialog()
        result = exportDialog.exec_()
        if result > 0:
            fileType, filePath = exportDialog.exportParams
            if fileType == 1:
                self.tableExportCsv(filePath)
            elif fileType == 2:
                self.tableExportExcel(filePath)

    def tableExportCsv(self, filePath):
        header, datas = [], []
        with MysqlCursor() as cursor:
            cursor.execute("select * from {tableName}".format(
                **{"tableName": self.tableName}))
            header = [item[0] for item in cursor.description]
            #datas = cursor.fetchall()

            import csv
            with open(filePath, "w", encoding="utf-8", newline="") as fp:
                # dialect为打开csv文件的方式,默认是excel,delimiter="\t"参数指写入的时候的分隔符
                csvwriter = csv.writer(fp, dialect=("excel"), delimiter=",")
                csvwriter.writerow(header)
                #这个应该是迭代器吧,内存应该不会很多
                for row in cursor:
                    csvwriter.writerow(row)

    def tableExportExcel(self, filePath):
        # with MysqlCursor() as cursor:
        #     cursor.execute("select * from {tableName}".format(**{"tableName":self.tableName}))
        #     header = [item[0] for item in cursor.description]
        #     # datas = cursor.fetchall()
        #
        #     import pandas as pd
        #     df = pd.DataFrame(cursor, columns=header)
        #     # engine='openpyxl'或者engine='xlsxwriter'
        #     with pd.ExcelWriter('table.xlsx', engine='xlsxwriter') as writer:
        #         df.to_excel(writer, sheet_name='Sheet1', columns=None, header=True, index=False)

        import xlsxwriter
        from datetime import datetime

        with MysqlCursor() as cursor:
            cursor.execute("select * from {tableName}".format(
                **{"tableName": self.tableName}))
            header = [item[0] for item in cursor.description]
            # datas = cursor.fetchall()

        workbook = xlsxwriter.Workbook(filePath)  # 新建excel表
        worksheet = workbook.add_worksheet(
            'sheet1')  # 新建sheet(sheet的名称为"sheet1")
        worksheet.write_row('A1', header)  # 写入表头
        for row, data in enumerate(cursor, start=1):
            for col, item in enumerate(data, start=0):
                if isinstance(item, datetime):
                    worksheet.write(row, col,
                                    item.strftime("%Y-%m-%d %H:%M:%S"))
                else:
                    worksheet.write(row, col, item)
        workbook.close()  # 将excel文件保存关闭,如果没有这一行运行代码会报错

    def loadTable(self):
        table = self.table
        displayParam = self.pageTool.displayParam

        table.clearContents()
        header, datas = [], []

        with MysqlCursor(host=self.host,
                         port=self.port,
                         user=self.user,
                         passwd=self.passwd,
                         db=self.db,
                         charset=self.charset) as cursor:
            queryParam = {
                "tableName": self.tableName,
                "offset": displayParam.offset,
                "pageSize": displayParam.pageSize
            }
            rows = cursor.execute(
                "select count(*) from {tableName}".format(**queryParam))

            displayParam.totalCount = cursor.fetchone()[0]
            self.pageTool.updateDisplay()

            #需要获取列名
            #if displayParam.totalCount > 0:
            rows = cursor.execute(
                "select * from {tableName} limit {offset},{pageSize}".format(
                    **queryParam))
            header = [item[0] for item in cursor.description]
            datas = cursor.fetchall()

        table.setColumnCount(len(header))
        # 注意必须在初始化行列之后进行,否则,没有效果
        table.setHorizontalHeaderLabels(header)

        table.setRowCount(len(datas))
        for i, row in enumerate(datas):
            for j, data in enumerate(row, start=0):

                item = QTableWidgetItem(str(data))
                table.setItem(i, j, item)