QT之——QTableWidget拖拽单元格并替换内容(进阶)
所需待重写函数:
[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event);
/*
* Filters events if this object has been installed as an event filter for the watched object.
* In your reimplementation of this function, if you want to filter the event out, i.e. stop it being handled further, return true; otherwise return false.
*/
以上来自官方帮助手册
说明:
- 通过事件过滤器,即上述重写函数,可通过条件,筛选所需事件
- 如果筛选成功,如果此事件后续不再使用,返回true,后续如果再次使用,返回false
- 如果筛选不成功,则返回给父类,防止父类处于内部目的重新实现了 eventFilter()
代码示例:
- MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTableWidget>
#define STANDFLDCOL 0
#define LAYERFLDCOL 1
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
bool eventFilter(QObject *watched, QEvent *event);
private:
/* init table widget cell data */
void InitCellData();
/* mouse press event */
void MousesPressEvent(QMouseEvent *event);
/* mouse move event */
void MousesMoveEvent();
/* mouse release event */
void MousesReleaseEvent(QMouseEvent *event);
/* exchange cell data between drag cell and drop cell */
void ExchangeData(int oldRow, int oldCol, int newRow, int newCol, QTableWidget *focusTable);
private:
Ui::MainWindow *ui;
int m_selectRow; // drag row
bool m_isPress; // mouse press
bool m_isDrag; // mouse is drag
};
#endif // MAINWINDOW_H
说明:
void InitCellData() : 初始化表格内容
void MousesPressEvent() : 如果事件过滤器中筛选了鼠标左键按下事件,则调用该函数
void MousesMoveEvent() : 如果事件过滤器筛选了鼠标移动事件,则调用该函数
void MousesReleaseEvent() : 如果事件过滤器筛选了鼠标释放事件,则调用该函数
void ExchangeData() : 交换拖拽起始单元格和最终单元格item
- MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QMouseEvent>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_isPress = false;
m_isDrag = false;
InitCellData();
}
MainWindow::~MainWindow()
{
ui->tableWidget->clear();
delete ui;
}
void MainWindow::InitCellData()
{
ui->tableWidget->viewport()->installEventFilter(this);
ui->tableWidget->horizontalHeader()->setVisible(false);
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tableWidget->setColumnCount(2);
ui->tableWidget->setRowCount(15);
for (int i = 0; i < 15; i++)
{
QTableWidgetItem *aitem = new QTableWidgetItem(QString("%1ATime").arg(i));
aitem->setFlags(aitem->flags()&(~Qt::ItemIsEditable));
ui->tableWidget->setItem(i, STANDFLDCOL, aitem);
QTableWidgetItem *bitem = new QTableWidgetItem(QString("%1BTime").arg(i));
bitem->setFlags(bitem->flags()&(~Qt::ItemIsEditable));
ui->tableWidget->setItem(i, LAYERFLDCOL, bitem);
}
}
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
if (watched == ui->tableWidget->viewport())
{
QMouseEvent *pEvent = static_cast<QMouseEvent*>(event);
if (event->type() == QEvent::MouseButtonPress)
{
MousesPressEvent(pEvent);
return true;
}
else if (event->type() == QEvent::MouseMove)
{
MousesMoveEvent();
return true;
}
else if (event->type() == QEvent::MouseButtonRelease)
{
MousesReleaseEvent(pEvent);
return true;
}
else return false;
}
return QMainWindow::eventFilter(watched, event);
}
void MainWindow::MousesPressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
if (STANDFLDCOL == ui->tableWidget->columnAt(event->x()))
{
return;
}
m_isPress = true;
m_isDrag = false;
m_selectRow = ui->tableWidget->rowAt(event->y());
ui->tableWidget->clearFocus();
}
}
void MainWindow::MousesMoveEvent()
{
if (m_isPress && !m_isDrag)
{
m_isDrag = true;
}
}
void MainWindow::MousesReleaseEvent(QMouseEvent *event)
{
if (m_isPress && m_isDrag)
{
m_isPress = false;
m_isDrag = false;
if (STANDFLDCOL == ui->tableWidget->columnAt(event->x()))
{
return;
}
ExchangeData(m_selectRow, LAYERFLDCOL, ui->tableWidget->rowAt(event->y()), LAYERFLDCOL, ui->tableWidget);
}
}
void MainWindow::ExchangeData(int oldRow, int oldCol, int newRow, int newCol, QTableWidget *focusTable)
{
QTableWidgetItem *oldItem = focusTable->takeItem(oldRow, oldCol);
QTableWidgetItem *newItem = focusTable->takeItem(newRow, newCol);
focusTable->setItem(oldRow, oldCol, newItem);
focusTable->setItem(newRow, newCol, oldItem);
}
说明:
限制拖拽列只能为第2列(可进行修改)
限值不同列之间不能进行拖拽(可进行修改)
QT之——QTableWidget拖拽单元格并替换内容(进阶)的更多相关文章
- C# Winform ListView实现单元格双击复制内容到剪贴板
private void listView_MouseDoubleClick(object sender, MouseEventArgs e) { ListView listview = (ListV ...
- (很难啊)如何实时获取DBGrid 中当前单元格输入的内容? [问题点数:100分,结帖人yifawu100]
如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理,用什么事件呢? 所以Field的Onchange事件是没用的. DBGrid1.Selec ...
- excel判断单元格包含指定内容的函数用=IF(COUNTIF(A1,"*内容*"),"0","1")
前面我们聊过怎样将Excel包含某字符的单元格填充颜色,这边我们用另外一种方法来实现:excel判断单元格包含指定内容的函数 选中需要显示结果的单元格,假设我们要判断第一行第一列的单元格A1是否含有“ ...
- 如何实时获取DBGrid 中当前单元格输入的内容?
如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理, 用什么事件呢? 所以Field的Onchange事件是没用的. 这个问题简单啊,每输入1 ...
- JS去遍历Table的所有单元格中的内容
用JS去遍历Table的所有单元格中的内容,可以用如下JS代码实现 function GetInfoFromTable(tableid) { var tableInfo = ""; ...
- excel用函数去掉单元格内容中的括号,并只保留单元格里面的内容
1.substitute(需要执行替换操作的单元格,需要替换的字符,替换后的字符,有多个需要替换的字符可以指定替换的第几个) 例如:aab--substitute("aab",&q ...
- Qt 无边框拖拽实现
Qt 无边框拖拽实现 头文件定义: class TDragProxy:public QObject { Q_OBJECT public: TDragProxy(QWidget* parent); ~T ...
- qt中的拖拽及其使用技巧
关于qt中的拖放操作,首先可以看这篇官方文档:http://doc.qt.io/qt-5.5/dnd.html 一.QDrag 首先是创建QDrag,可以在mousePressEvent或者mouse ...
- Qt中由表中单元格的QModelIndex获取Global Pos的正确方法
一直在尝试从单元格的行列索引(QModelIndex)获取其单元格的全局坐标(Global Pos)的方法,以期待在指定单元格附近弹出帮助信息.由View中的columnViewportPositio ...
随机推荐
- 在 Emit 代码中如何await一个异步方法
0. 前言 首先立马解释一波为啥会有这样一篇伪标题的Demo随笔呢? 不是本人有知识误区,或者要误人子弟 因为大家都知道emit写出来的都是同步方法,不可能await,至少现在这么多年来没有提供对应的 ...
- 为什么Java中lambda表达式不能改变外部变量的值,也不能定义自己的同名的本地变量呢?
作者:blindpirate链接:https://www.zhihu.com/question/361639494/answer/948286842来源:知乎著作权归作者所有.商业转载请联系作者获得授 ...
- elasticsearch迁移工具--elasticdump的使用
这篇文章主要讨论使用Elasticdump工具做数据的备份和type删除. Elasticsearch的备份,不像MYSQL的myslqdump那么方便,它需要一个插件进行数据的导出和导入进行备份和恢 ...
- uni-app 顶部tabbar切换
完成样式 项目地址:https://gitee.com/jielov/uni-app-tabbar 顶部tabbar代码 <!--顶部导航栏--> <view class=" ...
- mysql 应用 持续更新2 转载
作者:彼岸Queen旅行链接:https://www.zhihu.com/question/27334963/answer/266624031来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...
- 【Sphinx】 为Python自动生成文档
sphinx 前言 Sphinx是一个可以用于Python的自动文档生成工具,可以自动的把docstring转换为文档,并支持多种输出格式包括html,latex,pdf等 开始 建一个存放文档的do ...
- Java内存模型与线程(二)线程的实现和线程的调度
先行先发生原则(happen-before原则) 先行先发生是指Java内存模型中定义的两项操作之间的偏序关系. 如果说A先行于B,其实就是说在发生B操作之前,操作A产生的影响能被操作B观察到,至于这 ...
- .NET 云原生架构师训练营(模块二 基础巩固 敏捷开发)--学习笔记
2.7.1 敏捷开发 敏捷介绍 敏捷的起源 敏捷软件开发宣言 敏捷开发十二原则 生命周期对比 敏捷开发的特点 敏捷的发展 敏捷的核心 敏捷的起源 2001年,17个老头子在一起一边滑雪,一边讨论工作, ...
- 十三:SQL注入之MYSQL注入
MYSQL注入中首先要明确当前注入点权限,高权限注入时有更多的攻击手法,有的能直接进行getshell操作,其中也会遇到很多的阻碍,相关防御手法也要明确,所谓知己知彼,百战不殆.作为安全开发工作者,攻 ...
- P2986 [USACO10MAR]伟大的奶牛聚集(思维,dp)
题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...