2010-06-28 33 views
8

Vì vậy, tôi có một câu hỏi liên quan chặt chẽ đến một câu hỏi khác mà tôi đã thấy ở đây, nhưng khi tôi thử đặt câu hỏi của mình ở đó, tôi không có phản hồi, tôi hy vọng bằng cách đặt câu hỏi này giúp tôi. Về cơ bản tôi muốn chỉ cần sao chép một phần của bảng của tôi mà tôi đã tạo ra để tôi có thể dán nó vào một tập tin excel. Dưới đây là những gì tôi có:Sao chép một phần của QTableView

QAbstractItemModel *abmodel = ui.tableview->model(); 
    QItemSelectionModel *model = ui.tableview->selectionModel(); 
    QModelIndexList list = model->selectionIndexes(); 
    qSort(list); 
    QModelIndex index = list.first(); 
    for(int i = 0; i < list.size(); i++) 
{ 
    QModelIndex index = list.at(i); 
    QString text = abmodel->data(index).toString(); 
    copy_table.append(text); 

    if(index.row() != previous.row()) 
    { 
     copy_table.append('\n'); 
    } 
    else 
    { 
     copy_table.append('\t'); 
    } 
    previous = index; 
} 

QClipboard *clipboard = QApplication::clipboard(); 
clipboard->setText(copy_table); 

này sẽ sao chép một cột tốt, nhưng khi tôi cố gắng để sao chép một hàng hoặc nói một 2x2 subtable chỉ số hàng được điều sai lầm, sai gán chỉ số hàng cho các giá trị. Có suy nghĩ gì không?

Trả lời

13

Vâng, đã tìm ra, xin lỗi bất cứ ai lãng phí thời gian của họ và nhìn.

void TestCopyTable::on_pushButton_copy_clicked() 
{ 
QAbstractItemModel *abmodel = ui.tableView->model(); 
QItemSelectionModel * model = ui.tableView->selectionModel(); 
QModelIndexList list = model->selectedIndexes(); 

qSort(list); 

if(list.size() < 1) 
    return; 

QString copy_table; 
QModelIndex last = list.last(); 
QModelIndex previous = list.first(); 

list.removeFirst(); 

for(int i = 0; i < list.size(); i++) 
{ 
    QVariant data = abmodel->data(previous); 
    QString text = data.toString(); 

    QModelIndex index = list.at(i); 
    copy_table.append(text); 

    if(index.row() != previous.row()) 

    { 
     copy_table.append('\n'); 
    } 
    else 
    { 
     copy_table.append('\t'); 
    } 
    previous = index; 
} 

copy_table.append(abmodel->data(list.last()).toString()); 
copy_table.append('\n'); 

QClipboard *clipboard = QApplication::clipboard(); 
clipboard->setText(copy_table); 

}

4

tôi đã viết một số mã dựa trên Phil để sao chép các lựa chọn khi người dùng nhập Control-C.

Tôi subclassed QTableWidget và overrode keyPressEvent():

void MyTableWidget::keyPressEvent(QKeyEvent* event) { 
    // If Ctrl-C typed 
    // Or use event->matches(QKeySequence::Copy) 
    if (event->key() == Qt::Key_C && (event->modifiers() & Qt::ControlModifier)) 
    { 
     QModelIndexList cells = selectedIndexes(); 
     qSort(cells); // Necessary, otherwise they are in column order 

     QString text; 
     int currentRow = 0; // To determine when to insert newlines 
     foreach (const QModelIndex& cell, cells) { 
      if (text.length() == 0) { 
       // First item 
      } else if (cell.row() != currentRow) { 
       // New row 
       text += '\n'; 
      } else { 
       // Next cell 
       text += '\t'; 
      } 
      currentRow = cell.row(); 
      text += cell.data().toString(); 
     } 

     QApplication::clipboard()->setText(text); 
    } 
} 

Output dụ (tách biệt bởi tab):

foo bar baz qux 
bar baz qux foo 
baz qux foo bar 
qux foo bar baz 
+0

Phạt tiền, sẵn sàng để sử dụng đoạn mã. 1 đặc biệt cho qSort của các tế bào. Điều đó có thể đã vấp ngã tôi trong một thời gian – Mizmor

+1

Từ http://stackoverflow.com/questions/1230222/selected-rows-line-in-qtableview-copy-to-qclipboard: bạn có thể sử dụng sự kiện-> kết quả phù hợp (QKeySequence :: Sao chép) thay vì kiểm tra thủ công ctrl + c – Legolas

+0

Ah có vẻ tốt hơn –

Các vấn đề liên quan