GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — sqlitebrowser/src/ExtendedTableWidget.cpp at master · feng2010java/sqlitebrowser Expand file tree/ Copy pathExtendedTableWidget.cppMore file actions 127 lines (107 loc) · 4.39 KB / Copy pathExtendedTableWidget.cppFile metadata and controls127 lines (107 loc) · 4.39 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 #include "ExtendedTableWidget.h" #include "sqlitetablemodel.h" #include "FilterTableHeader.h" #include <QApplication> #include <QClipboard> #include <QKeySequence> #include <QKeyEvent> #include <QScrollBar> #include <QHeaderView> ExtendedTableWidget::ExtendedTableWidget(QWidget* parent) : QTableView(parent) { setHorizontalScrollMode(ExtendedTableWidget::ScrollPerPixel); connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(vscrollbarChanged(int))); // Set up filter row m_tableHeader = new FilterTableHeader(this); setHorizontalHeader(m_tableHeader); } void ExtendedTableWidget::copy() { // Get list of selected items QItemSelectionModel* selection = selectionModel(); QModelIndexList indices = selection->selectedIndexes(); // Abort if there's nothing to copy if(indices.size() == 0) { return; } else if(indices.size() == 1) { qApp->clipboard()->setText(indices.front().data().toString()); return; } // Sort the items by row, then by column qSort(indices); // Go through all the items... QString result; QModelIndex prev = indices.front(); indices.removeFirst(); foreach(QModelIndex index, indices) { // Add the content of this cell to the clipboard string result.append(QString("\"%1\"").arg(prev.data().toString())); // If this is a new row add a line break, if not add a tab for cell separation if(index.row() != prev.row()) result.append("\r\n"); else result.append("\t"); prev = index; } result.append(QString("\"%1\"\r\n").arg(indices.last().data().toString())); // And the last cell // And finally add it to the clipboard qApp->clipboard()->setText(result); } void ExtendedTableWidget::keyPressEvent(QKeyEvent* event) { // Call a custom copy method when Ctrl-C is pressed if(event->matches(QKeySequence::Copy)) { copy(); } else if(event->key() == Qt::Key_Tab && hasFocus() && selectedIndexes().count() == 1 && selectedIndexes().at(0).row() == model()->rowCount()-1 && selectedIndexes().at(0).column() == model()->columnCount()-1) { // If the Tab key was pressed while the focus was on the last cell of the last row insert a new row automatically model()->insertRow(model()->rowCount()); } // This prevents the current selection from being changed when pressing tab to move to the next filter. Note that this is in an 'if' condition, // not in an 'else if' because this way, when the tab key was pressed and the focus was on the last cell, a new row is inserted and then the tab // key press is processed a second time to move the cursor as well if((event->key() != Qt::Key_Tab && event->key() != Qt::Key_Backtab) || hasFocus()) QTableView::keyPressEvent(event); } void ExtendedTableWidget::updateGeometries() { // Call the parent implementation first - it does most of the actual logic QTableView::updateGeometries(); // Check if a model has already been set yet if(model()) { // If so and if it is a SqliteTableModel and if the parent implementation of this method decided that a scrollbar is needed, update its maximum value SqliteTableModel* m = qobject_cast<SqliteTableModel*>(model()); if(m && verticalScrollBar()->maximum()) verticalScrollBar()->setMaximum(m->totalRowCount() - numVisibleRows() + 1); } } void ExtendedTableWidget::vscrollbarChanged(int value) { // Cancel if there is no model set yet - this shouldn't happen (because without a model there should be no scrollbar) but just to be sure... if(!model()) return; // Fetch more data from the DB if necessary if((value + numVisibleRows()) >= model()->rowCount() && model()->canFetchMore(QModelIndex())) model()->fetchMore(QModelIndex()); } int ExtendedTableWidget::numVisibleRows() { // Get the row numbers of the rows currently visible at the top and the bottom of the widget int row_top = rowAt(0) == -1 ? 0 : rowAt(0); int row_bottom = rowAt(height()) == -1 ? model()->rowCount() : rowAt(height()); // Calculate the number of visible rows return row_bottom - row_top; } QSet<int> ExtendedTableWidget::selectedCols() { QSet<int> selectedCols; foreach(const QModelIndex & idx, selectedIndexes()) selectedCols.insert(idx.column()); return selectedCols; } |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |