Добавьте кнопки в таблицу, используя «просмотр таблицы» - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь добавить кнопки ' Share ' и ' Delete ' в каждую строку таблицы, используя класс * table View"PySide.

Но я не могу этого сделать, так как не очень хорошо знаю PySide. Кто-нибудь может подсказать, пожалуйста, как добавить кнопки в табличное представление.

Ожидаемый результат: Expected Output

Мой код:

import sys
import os
import csv
from PySide import QtGui, QtCore



class Example(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)

        self.dirPath  = "/home/cioc/Documents/GPR/GRP"
        self.filePath = ""
        self.fileName =""
        self.lay1 = QtGui.QVBoxLayout()
        self.scrollArea = QtGui.QScrollArea()
        self.scrollArea.setBackgroundRole(QtGui.QPalette.Light)
        self.scrollArea.setWidgetResizable(True)
        self.mainLayout =QtGui. QGridLayout()

        self.mainLayout.addWidget(self.scrollArea,0,1)

        self.setCentralWidget(QtGui.QWidget(self))
        self.centralWidget().setLayout(self.mainLayout)
        self.setGeometry(100,100,800,500)

        self.w = QtGui.QWidget()
        self.lay = QtGui.QVBoxLayout()
        self.model  =QtGui. QStandardItemModel(self)
        self.tableView = QtGui.QTableView(self)
        self.tableView.setModel(self.model)
        self.tableView.horizontalHeader().setStretchLastSection(True)
        self.tableView.clicked[QtCore.QModelIndex].connect(self.onClick)
        self.tableView.verticalHeader().setVisible(False)
        self.appendRowItems(self.dirPath)
        self.lay.addWidget(self.tableView)
        self.w.setLayout(self.lay)
        self.scrollArea.setWidget(self.w)

        # self.btn_sell = QtGui.QPushButton('Delete')
        # self.btn_sell.clicked.connect(self.delete)
    def appendRowItems(self, dir):
        for root, dirs, files in os.walk(dir):
            if root == dir:
                for file in files:
                    self.model.appendRow(QtGui.QStandardItem(file))

    # def delete(self,index):
        # self.model.clear()

    def onClick(self, ind):
        self.filePath = self.dirPath +"/"+ self.model.item(ind.row(), ind.column()).text()

        print(self.filePath)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    eg =  Example()
    eg.show()
    app.exec_()

1 Ответ

0 голосов
/ 26 октября 2018

Один из вариантов - реализовать делегата:

import os
import sys
from PySide import QtGui, QtCore

class ViewWidget(QtGui.QWidget):
    def __init__(self, x, index, parent=None):
        super(ViewWidget, self).__init__(parent)
        self.p_index = QtCore.QPersistentModelIndex(index)
        self.content_button = QtGui.QWidget(self)
        lay = QtGui.QHBoxLayout(self.content_button)
        lay.setContentsMargins(0, 0, 0,0)
        self.share_btn = QtGui.QPushButton("share")
        self.share_btn.clicked.connect(self.share_clicked)
        self.delete_btn = QtGui.QPushButton("delete")
        self.delete_btn.clicked.connect(self.delete_clicked)
        lay.addWidget(self.share_btn)
        lay.addWidget(self.delete_btn)
        self.content_button.move(x, 0)

    @QtCore.Slot()
    def delete_clicked(self):
        model = self.p_index.model()
        model.removeRow(self.p_index.row())

    @QtCore.Slot()
    def share_clicked(self):
        text = self.p_index.data()
        full_path = self.p_index.data(QtCore.Qt.UserRole+1)
        print(text, full_path)


class ButtonsDelegate(QtGui.QStyledItemDelegate):
    def paint(self, painter, option, index):
        self.parent().openPersistentEditor(index)
        super(ButtonsDelegate, self).paint(painter, option, index)

    def createEditor(self, parent, option, index):
        return ViewWidget(300, index, parent)

class Example(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)

        dirPath  = "/home/cioc/Documents/GPR/GRP"

        self.setCentralWidget(QtGui.QWidget())
        layout = QtGui. QGridLayout(self.centralWidget())

        self.model  =QtGui.QStandardItemModel(self)
        self.tableView = QtGui.QTableView()
        self.tableView.setModel(self.model)
        self.tableView.horizontalHeader().setStretchLastSection(True)
        self.tableView.clicked.connect(self.onClick)
        self.tableView.verticalHeader().hide()
        self.appendRowItems(dirPath)

        delegate = ButtonsDelegate(self.tableView)
        self.tableView.setItemDelegate(delegate)

        layout.addWidget(self.tableView)
        self.resize(800,500)

    def appendRowItems(self, dir_path):
        for root, dirs, files in os.walk(dir_path):
            if root == dir_path:
                for file in files:
                    item = QtGui.QStandardItem(file)
                    item.setData(os.path.join(root, file))
                    self.model.appendRow(item)

    @QtCore.Slot(QtCore.QModelIndex)
    def onClick(self, ix):
        it = self.model.itemFromIndex(ix)
        print(it.data())


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    eg =  Example()
    eg.show()
    sys.exit(app.exec_())

или setIndexWidget():

import os
import sys
from PySide import QtGui, QtCore

class ViewWidget(QtGui.QWidget):
    def __init__(self, x, index, parent=None):
        super(ViewWidget, self).__init__(parent)
        self.p_index = QtCore.QPersistentModelIndex(index)
        self.content_button = QtGui.QWidget(self)
        lay = QtGui.QHBoxLayout(self.content_button)
        lay.setContentsMargins(0, 0, 0,0)
        self.share_btn = QtGui.QPushButton("share")
        self.share_btn.clicked.connect(self.share_clicked)
        self.delete_btn = QtGui.QPushButton("delete")
        self.delete_btn.clicked.connect(self.delete_clicked)
        lay.addWidget(self.share_btn)
        lay.addWidget(self.delete_btn)
        self.content_button.move(x, 0)

    @QtCore.Slot()
    def delete_clicked(self):
        model = self.p_index.model()
        model.removeRow(self.p_index.row())

    @QtCore.Slot()
    def share_clicked(self):
        text = self.p_index.data()
        full_path = self.p_index.data(QtCore.Qt.UserRole+1)
        print(text, full_path)

class Example(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)

        dirPath  = "/home/cioc/Documents/GPR/GRP"

        self.setCentralWidget(QtGui.QWidget())
        layout = QtGui. QGridLayout(self.centralWidget())

        self.model  =QtGui.QStandardItemModel(self)
        self.tableView = QtGui.QTableView()
        self.tableView.setModel(self.model)
        self.tableView.horizontalHeader().setStretchLastSection(True)
        self.tableView.clicked.connect(self.onClick)
        self.tableView.verticalHeader().hide()
        self.appendRowItems(dirPath)

        layout.addWidget(self.tableView)
        self.resize(800,500)

    def appendRowItems(self, dir_path):
        for root, dirs, files in os.walk(dir_path):
            if root == dir_path:
                for file in files:
                    item = QtGui.QStandardItem(file)
                    item.setData(os.path.join(root, file))
                    self.model.appendRow(item)
                    ix = self.model.indexFromItem(item)
                    self.tableView.setIndexWidget(ix, ViewWidget(300, ix))

    @QtCore.Slot(QtCore.QModelIndex)
    def onClick(self, ix):
        it = self.model.itemFromIndex(ix)
        print(it.data())


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    eg =  Example()
    eg.show()
    sys.exit(app.exec_())
...