一、鼠標懸浮在item上 顯示提示信息
1、在構造函數開啟table Widget控件的鼠標捕獲功能
// 開啟鼠標捕獲功能(實現table widget的懸浮功能) ui.tableWidget->setMouseTracking(true);
2、連接信號和槽
connect(ui.tableWidget, SIGNAL( cellEntered(int, int)), this, SLOT(slotCellEntered(int, int)));
3、編寫槽函數
void test10292::slotCellEntered(int r, int c) { QTableWidgetItem* item = ui.tableWidget->item(r, c); if (item == nullptr) { return; } QToolTip::showText(QCursor::pos(), item->text()); }
二:點擊表頭實現排序
第二個是后實現的,按數值排序,因為Qt自帶的排序是按 字段排序的
// 連接信號和槽 connect(ui.tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(sortHeader(int))); // 實現槽函數 void test10292::sortHeader(int index) { if (index == 2) { ui.tableWidget->sortItems(index, Qt::DescendingOrder); return; } ui.tableWidget->sortItems(index, Qt::AscendingOrder); }
void test10292::sortHeader(int index) { if (index == 0 || index == 2) { sortTableItem(index); return; } ui.tableWidget->sortItems(index, Qt::AscendingOrder); } // 表頭排序 void test10292::sortTableItem(int index) { int rowCountNum = ui.tableWidget->rowCount(); for (int i = rowCountNum - 1; i >= 0; i--) { for (int j = 0; j < i; j++) { if (ui.tableWidget->item(j, index)->text().toInt() < ui.tableWidget->item(j + 1, index)->text().toInt()) { QString str1 = ui.tableWidget->item(j + 1, 0)->text(); QString str2 = ui.tableWidget->item(j + 1, 1)->text(); QString str3 = ui.tableWidget->item(j + 1, 2)->text(); ui.tableWidget->item(j + 1, 0)->setText(ui.tableWidget->item(j, 0)->text()); ui.tableWidget->item(j + 1, 1)->setText(ui.tableWidget->item(j, 1)->text()); ui.tableWidget->item(j + 1, 2)->setText(ui.tableWidget->item(j, 2)->text()); ui.tableWidget->item(j, 0)->setText(str1); ui.tableWidget->item(j, 1)->setText(str2); ui.tableWidget->item(j, 2)->setText(str3); } } } }
三:拖拽item 實現兩個item內容的互換
需要寫一個類MyQTableWidget繼承自QTableWidget,然后重寫mousePressEvent和dropEvent事件處理函數
MyQTableWidget.h 文件
#ifndef MYQTABLEWIDGET_H #define MYQTABLEWIDGET_H #include <QTableWidget> #include <QMouseEvent> #include <QDebug> class MyQTableWidget : public QTableWidget { Q_OBJECT public: MyQTableWidget(QWidget *parent); ~MyQTableWidget(); private: QString temp; QPoint m_spos, m_dpos; QTableWidgetItem* sitem; QTableWidgetItem* ditem; void mousePressEvent(QMouseEvent *event); void dropEvent(QDropEvent *event); }; #endif // MYQTABLEWIDGET_H
MyQTableWidget.cpp 文件
#include "MyQTableWidget.h" MyQTableWidget::MyQTableWidget(QWidget *parent) :QTableWidget(parent) { /******************** 實現表格控件拖拽item交換數據 ********************/ this->setDragDropMode(QAbstractItemView::DragDrop); this->setDragEnabled(true); this->setAcceptDrops(true); //選中一個Item this->setSelectionBehavior(QAbstractItemView::SelectItems); } MyQTableWidget::~MyQTableWidget() { } void MyQTableWidget::mousePressEvent(QMouseEvent *event) { m_spos = event->pos(); sitem = new QTableWidgetItem(); sitem = QTableWidget::itemAt(m_spos); if (sitem == NULL) { return; } temp = sitem->text(); QTableWidget::mousePressEvent(event); } void MyQTableWidget::dropEvent(QDropEvent *event) { m_dpos = event->pos(); ditem = new QTableWidgetItem(); ditem = QTableWidget::itemAt(m_dpos); if (ditem == NULL) { return; } sitem->setText(ditem->text()); ditem->setText(temp); }
四:在 item 里面添加CheckBox控件
1、添加選擇功能
QTableWidgetItem* item = new QTableWidgetItem(); item = new QTableWidgetItem(); item->setCheckState(Qt::Unchecked); item->setText(QString::fromLocal8Bit("勾選")); item->setBackgroundColor(QColor(0x00, 0xFF, 0x00)); ui.tableWidget->setItem(row, 3, item);
2、復選框選擇事件處理
// 連接信號和槽 connect(ui.tableWidget, SIGNAL(cellClicked(int, int)), this, SLOT(stateChecked(int, int))); // 實現槽函數 void test10292::stateChecked(int row, int column ) { if (column == 3) { QTableWidgetItem* item = ui.tableWidget->item(row, column); if (item != NULL) { if (item->checkState() == Qt::Checked) { // 選中紅色 item->setBackgroundColor(QColor(0xFF, 0x00, 0x00)); } else if (item->checkState() == Qt::Unchecked) { // 沒選中綠色 item->setBackgroundColor(QColor(0x00, 0xFF, 0x00)); } } } }
五:插入復選框的第二種方法
QCheckBox* cb = new QCheckBox(); cb->setText(QString::fromLocal8Bit("易語言")); ui.tableWidget->setCellWidget(row, 3, cb);
六:其中一個item是CheckBox控件,拖拽實現交換兩個item(包括控件交換)
主要是通過 item 的關聯數據來實現, 插入數據的時候如果是控件關聯數據設置為一個值,不是控件設置為另外一個值。然后在dropEvent()事件函數里面處理。
void test10292::AddData(const QString& id, const QString& name, int score) { int row = ui.tableWidget->rowCount(); ui.tableWidget->insertRow(row); // ID QTableWidgetItem* item = new QTableWidgetItem(); item->setText(id); item->setData(Qt::ToolTip, ""); ui.tableWidget->setItem(row, 0, item); item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); // name item = new QTableWidgetItem(); item->setText(name); item->setData(Qt::ToolTip, ""); ui.tableWidget->setItem(row, 1, item); item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); // score item = new QTableWidgetItem(); item->setText(QString::number(score)); item->setData(Qt::ToolTip, ""); ui.tableWidget->setItem(row, 2, item); item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); // 第四列插入復選框 /*QCheckBox* cb = new QCheckBox(); cb->setText(QString::fromLocal8Bit("易語言")); ui.tableWidget->setCellWidget(row, 3, cb);*/ item = new QTableWidgetItem(); item->setCheckState(Qt::Unchecked); item->setText(QString::fromLocal8Bit("勾選")); item->setBackgroundColor(QColor(0x00, 0xFF, 0x00)); item->setData(Qt::ToolTip, "this is tooltip"); ui.tableWidget->setItem(row, 3, item); }
#include "MyQTableWidget.h" MyQTableWidget::MyQTableWidget(QWidget *parent) :QTableWidget(parent) { /******************** 實現表格控件拖拽item交換數據 ********************/ this->setDragDropMode(QAbstractItemView::DragDrop); this->setDragEnabled(true); this->setAcceptDrops(true); //選中一個Item this->setSelectionBehavior(QAbstractItemView::SelectItems); } MyQTableWidget::~MyQTableWidget() { } void MyQTableWidget::mousePressEvent(QMouseEvent *event) { m_spos = event->pos(); sitem = new QTableWidgetItem(); sitem = QTableWidget::itemAt(m_spos); if (sitem == NULL) { return; } temp = sitem->text(); QTableWidget::mousePressEvent(event); } void MyQTableWidget::dropEvent(QDropEvent *event) { m_dpos = event->pos(); ditem = new QTableWidgetItem(); ditem = QTableWidget::itemAt(m_dpos); if (ditem == NULL) { return; } if (sitem->data(Qt::ToolTip).toString() == "this is tooltip" && ditem->data(Qt::ToolTip).toString() == "") { int r = sitem->row(); int c = sitem->column(); delete sitem; QTableWidgetItem* itemTemp = new QTableWidgetItem(); itemTemp->setText(ditem->text()); itemTemp->setData(Qt::ToolTip, ""); // 文本背景色設置為白色 itemTemp->setBackgroundColor(QColor(0xFF, 0xFF, 0xFF)); itemTemp->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); this->setItem(r, c, itemTemp); ditem->setText(temp); ditem->setCheckState(Qt::Unchecked); ditem->setData(Qt::ToolTip, "this is tooltip"); ditem->setBackgroundColor(QColor(0x00, 0xFF, 0x00)); } else if (sitem->data(Qt::ToolTip).toString() == "this is tooltip" && ditem->data(Qt::ToolTip).toString() == "this is tooltip") { sitem->setText(ditem->text()); ditem->setText(temp); } else if (sitem->data(Qt::ToolTip).toString() == "" && ditem->data(Qt::ToolTip).toString() == "this is tooltip") { sitem->setText(ditem->text()); sitem->setCheckState(Qt::Unchecked); sitem->setData(Qt::ToolTip, "this is tooltip"); sitem->setBackgroundColor(QColor(0x00, 0xFF, 0x00)); int r = ditem->row(); int c = ditem->column(); delete ditem; QTableWidgetItem* itemTemp = new QTableWidgetItem(); itemTemp->setText(temp); itemTemp->setData(Qt::ToolTip, ""); // 文本背景色設置為白色 itemTemp->setBackgroundColor(QColor(0xFF, 0xFF, 0xFF)); itemTemp->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); this->setItem(r, c, itemTemp); } QTableWidget::dropEvent(event); }