【问题标题】:Copy & Paste in QTableView在 QTableView 中复制和粘贴
【发布时间】:2014-02-10 10:59:37
【问题描述】:

在 QTableView 中,复制和粘贴表格的字段已经实现,但只有在字段处于编辑模式时(如果我们双击一个字段)..我想知道如何复制和粘贴字段以防万一他们只是在查看模式..任何提示将不胜感激。

P.S: 我的代码是 Python 的..

【问题讨论】:

  • 查看类似this 的内容。很可能您必须自己实现它。
  • 这仅执行复制部分..我需要复制一个字段并将其粘贴到表的其他字段..
  • 我可以将其复制并粘贴到其他地方,例如记事本或 Excel 中。但我无法将其粘贴到表格的另一个字段中。

标签: python qt pyqt copy-paste qtableview


【解决方案1】:

这是我创建的一个 QAction,用于将选定的单元格复制到剪贴板。 基本上,当您初始化 QAction 时,您会向它传递一个它绑定到的表小部件。触发操作时,获取选定的单元格,将它们排序为行和列,并将文本复制到剪贴板。

class CopySelectedCellsAction(QtGui.QAction):
    def __init__(self, table_widget):
        if not isinstance(table_widget, QtGui.QTableWidget):
            raise ValueError(str('CopySelectedCellsAction must be initialised with a QTableWidget. A %s was given.' % type(table_widget)))
        super(CopySelectedCellsAction, self).__init__("Copy", table_widget)
        self.setShortcut('Ctrl+C')
        self.triggered.connect(self.copy_cells_to_clipboard)
        self.table_widget = table_widget

    def copy_cells_to_clipboard(self):
        if len(self.table_widget.selectionModel().selectedIndexes()) > 0:
            # sort select indexes into rows and columns
            previous = self.table_widget.selectionModel().selectedIndexes()[0]
            columns = []
            rows = []
            for index in self.table_widget.selectionModel().selectedIndexes():
                if previous.column() != index.column():
                    columns.append(rows)
                    rows = []
                rows.append(index.data())
                previous = index
            columns.append(rows)
            print columns       

            # add rows and columns to clipboard            
            clipboard = ""
            nrows = len(columns[0])
            ncols = len(columns)
            for r in xrange(nrows):
                for c in xrange(ncols):
                    clipboard += columns[c][r]
                    if c != (ncols-1):
                        clipboard += '\t'
                clipboard += '\n'

            # copy to the system clipboard
            sys_clip = QtGui.QApplication.clipboard()
            sys_clip.setText(clipboard)

【讨论】:

    【解决方案2】:

    您可以执行类似 Excel 的复制粘贴格式,通过剪贴板传递表格数据: copy() 的实现大致是:

        int t = model->rowCount();
        int b = -1;
        int l = model->columnCount();
        int r = -1;
    
        QList<QModelIndex> indexes = view->selectionModel()->selection().indexes();
        foreach(QModelIndex index, indexes) {
            t = qMin(t, index.row());
            b = qMax(b, index.row());
            l = qMin(l, index.column());
            r = qMax(r, index.column());
        }
    
        if ( r <0 ) return;
        if ( b <0 ) return;
    
        QString data = "<!--StartFragment-->\n";
        data += "<table>";
    
        for (int row=t;row<=b;row++) {
            data += "<tr>\n";
            for (int col=l;col<=r;col++) {
                QVariant v = model->data( model->index(row,col) );
                if ( v.canConvert(QVariant::Double) ) data += "  <td x:num>";
                else data += "  <td>";
    
                data += v.toString();
                data += "</td>\n";
            }
            data += "</tr>\n";
        }
    
        data += "</table>";
        data += "<!--EndFragment-->\n";
    
        QMimeData * mimeData = new QMimeData;
        mimeData->setHtml( data );
        QApplication::clipboard()->setMimeData(mimeData);
    

    对于 paste(),您只需要实现对此类 html 表的简单解析。 然后,您也可以在 Excel 或其他类似表格的应用程序中进行复制粘贴。

    另一种标准方式(Excel 和其他使用表格的应用程序也支持)是纯文本 QClipboard 数据制表符分隔单元格分隔符。形成制表符分隔文本的代码非常相似,但 paste() 的解析更加简单。

    【讨论】:

    • 谢谢..在你的回答中给出了很好的提示,但我正在用 python 编写,我只有读取copyedItem(在剪贴板中)并将其粘贴到 QTableView 文件中的问题
    • 是的,使用 python 实现可以更短。我只是把这个作为例子或起点
    • 我用更具体的方式写了我的问题here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多