首页 > 其他分享 >Qt Table Widget常用操作 添加复选框控件

Qt Table Widget常用操作 添加复选框控件

时间:2022-09-27 10:34:00浏览次数:51  
标签:控件 Widget Qt int item tableWidget ui ditem

Qt Table Widget常用操作


一、鼠标悬浮在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 == )
{
ui.tableWidget->sortItems(index, Qt::DescendingOrder);
return;
}
ui.tableWidget->sortItems(index, Qt::AscendingOrder);
}
void test10292::sortHeader(int index)
{
if (index == || index == )
{
sortTableItem(index);
return;
}
ui.tableWidget->sortItems(index, Qt::AscendingOrder);
}
// 表头排序
void test10292::sortTableItem(int index)
{
int rowCountNum = ui.tableWidget->rowCount();
for (int i = rowCountNum - ; i >= ; i--)
{
for (int j = ; j < i; j++)
{
if (ui.tableWidget->item(j, index)->text().toInt() < ui.tableWidget->item(j + , index)->text().toInt())
{
QString str1 = ui.tableWidget->item(j + , )->text();
QString str2 = ui.tableWidget->item(j + , )->text();
QString str3 = ui.tableWidget->item(j + , )->text();
ui.tableWidget->item(j + , )->setText(ui.tableWidget->item(j, )->text());
ui.tableWidget->item(j + , )->setText(ui.tableWidget->item(j, )->text());
ui.tableWidget->item(j + , )->setText(ui.tableWidget->item(j, )->text());
ui.tableWidget->item(j, )->setText(str1);
ui.tableWidget->item(j, )->setText(str2);
ui.tableWidget->item(j, )->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, , item);

2、复选框选择事件处理

// 连接信号和槽
connect(ui.tableWidget, SIGNAL(cellClicked(int, int)), this, SLOT(stateChecked(int, int)));
// 实现槽函数
void test10292::stateChecked(int row, int column )
{
if (column == )
{
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, , 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, , item);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
// name
item = new QTableWidgetItem();
item->setText(name);
item->setData(Qt::ToolTip, "");
ui.tableWidget->setItem(row, , item);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
// score
item = new QTableWidgetItem();
item->setText(QString::number(score));
item->setData(Qt::ToolTip, "");
ui.tableWidget->setItem(row, , 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, , 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);
}

标签:控件,Widget,Qt,int,item,tableWidget,ui,ditem
From: https://www.cnblogs.com/managechina/p/16733634.html

相关文章

  • 一文入门Qt Quick
    以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16733091.html初识QtQuick很高兴可以来到这一章,终于可以开始......
  • SAP UI5 sap.ui.layout.Grid 控件宽度百分比的设置原理
    在Chrome开发者工具里使用SAPUI5扩展Inspector修改Grid控件的defaultSpan属性,会触发如下的代码:我们通过调用栈,可以发现SAPUI5Grid相关的框架代码调用,确......
  • SAP UI5 SimpleForm 控件实例的初始化调试
    simpleForm在XML视图里定义的editable属性:会触发SimpleForm.setEditable方法调用:同理,设置layout属性:这个layout是一个单独的实例:addAllToContent:把Si......
  • MQTTX_测试调用
    1、软件下载链接:https://pan.baidu.com/s/1I4gJvY9bNWmAe4zGXSS_ow 提取码:a3rl2、切换语言 3、填写连接信息 4、订阅 ......
  • kivy入门初级控件(一)
    异步加载图片1fromkivy.appimportApp2fromkivy.uix.gridlayoutimportGridLayout3fromkivy.uix.imageimportImage,AsyncImage456classImageB......
  • Android activity控制RecyclerView中Adapter中的控件的显示和隐藏
    在实际开发中,我们通常会遇到,通过外面的控件去控制Adapter里面的checkbox按钮的显示或隐藏: 需求就是:点击批量选择显示checkbox,再次点击隐藏。 思路:在activity中,定义......
  • mqtt的使用
    1.mqttws31.js/********************************************************************************Copyright(c)2013IBMCorp.**Allrightsreserved.This......
  • qt的基本控件——显示控件
    显示控件1、label作用就是用来显示一些文字的,或者用来贴图1、加载资源方式:右键项目-->addnew输入名字,就能得到一个qrc的一个包,然后在这个位置添加前缀/image表示图......
  • Qt 开发应用程序Debug与Release设置
    一般来说,release版的可执行程序在体积上比起debug版要小很多(数倍甚至数十倍的差异),而且由于剥离了许多调试信息及符号等运行效率相对也高一些。然而在使用Qt开发中偶尔......
  • QT——直接定位到exe程序所在的目录
    #pragmaonce#include<QApplication>#include<QDir>#defineIMAGE_PATH(name)QApplication::applicationDirPath()+QDir::separator()+"image"+QDir::separat......