我有一个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 &current, 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/

10-11 19:34