在QTableView中,复制和粘贴表的字段已经实现,但只有当字段处于编辑模式时(如果我们双击字段)...我想知道如何复制和粘贴字段以防万一他们只是处于查看模式。任何提示都将受到赞赏。
P.S:我的代码是Python ..
答案 0 :(得分:3)
这是我创建的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)
答案 1 :(得分: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()更简单。