一、滑鼠懸浮在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);
}
Qt學習路線:Qt學習路線
資料領取:Qt資料領取(視訊教程+文檔+代碼+項目實戰)