我有一个SQLite-Database,并将其转换为QSqlTableModel
。
为了显示数据库,我将该模型放入了QTableView
中。
现在,我想创建一个方法,将选定的行(或整行)复制到QClipboard
中。之后,我要将其插入到我的OpenOffice.Calc文档中。
但是我不知道该如何处理Selected
SIGNAL和QModelIndex
以及如何将其放入剪贴板。
最佳答案
要实际捕获选择,您可以使用项目 View 的selection model获得list of indices。假设您有一个称为QTableView *
的view
,则可以通过以下方式获得选择:
QAbstractItemModel * model = view->model();
QItemSelectionModel * selection = view->selectionModel();
QModelIndexList indexes = selection->selectedIndexes();
然后遍历索引列表,对每个索引调用
model->data(index)
。如果尚未将数据转换为字符串,则将每个字符串连接在一起。然后,您可以使用QClipboard.setText
将结果粘贴到剪贴板。请注意,对于Excel和Calc,每一列之间用换行符(“\n”)隔开,而每一行则用制表符(“\t”)隔开。您必须检查索引以确定何时移动到下一行。QString selected_text;
// You need a pair of indexes to find the row changes
QModelIndex previous = indexes.first();
indexes.removeFirst();
foreach(const QModelIndex ¤t, indexes)
{
QVariant data = model->data(current);
QString text = data.toString();
// At this point `text` contains the text in one cell
selected_text.append(text);
// If you are at the start of the row the row number of the previous index
// isn't the same. Text is followed by a row separator, which is a newline.
if (current.row() != previous.row())
{
selected_text.append('\n');
}
// Otherwise it's the same row, so append a column separator, which is a tab.
else
{
selected_text.append('\t');
}
previous = current;
}
QApplication.clipboard().setText(selected_text);
警告:我没有机会尝试此代码,但PyQt等效项可以工作。
关于c++ - QTableView中的选定行,复制到QClipboard,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1230222/