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 ...
随机推荐
- Spring事务管理?
事务管理方式: 1.编码方案,不建议使用,具有侵入性,在原有的业务代码基础上去添加事物管理代码 2.声明式事务控制,基于AOP对目标进行代理,不具有侵入性,不需要修改原来的业务代码
- ProceedingJoinPoint 某些方法记录一下
转载与百度知道,记录一下.遇到在去看API 官方文档//拦截的实体类 Object target = point.getTarget(); //拦截的方法名称 String methodName = ...
- JavaScript 函数节流和函数去抖
概念 函数防抖(debounce) 当调用动作过n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间 函数节流(throttle) 预先设定一个执行周期,当调用动作的时刻大于等于执 ...
- eclipse下的jetty远程调试设置
在windows下的jetty远程调试设置1.首先说明的是windows下的jetty是通过命令java -jar start.jar来启动的,因此要想设置成远程调试模式,则要改用命令java -X ...
- ES6箭头函数与this指向
一.ES6箭头函数 ES6之前的语法想要定义一个函数,如图example1,ES6之后定义一个函数如图example2,相比较之下简洁了很多 二.函数的this指向 非箭头函数,谁调用函数this指向 ...
- Redis缓存篇(二)淘汰机制:缓存满了怎么办?
上一讲提到,缓存的容量总是小于后端数据库的.随着业务系统的使用,缓存数据会撑满内存空间,该怎么处理呢? 本节我们来学习内存淘汰机制.在Redis 4.0之前有6种内存淘汰策略,之后又增加2种,一共8种 ...
- Azure Terraform(三)部署 Web 应用程序
一,引言 上一节关于 Terraform 的文章讲到 Terraform 使用到的一些语法,以及通过演示使用 Terraform 在Azure 上部署资源组,极大的方便了基础设施实施人员,也提高了基础 ...
- chatsRoom Design Report
基于TCP实现聊天室 主要使用四个类 ChatClient类 使用BufferedReader 得到输入流,使用OutputStream得到输出流 实现读取服务器广播的消息和发送消息到 ...
- 给编译出的程序添加图标(exe的图标)
安装依赖: go get github.com/akavel/rsrc 在对应程序的源码路径下创建manifest文件,图标也要放进去(xxx.ico), 命名:main.exe.manifest : ...
- Linux学习笔记 | 常见错误之无法获得锁
问题: 当运行sudo apt-get install/update/其他命令时,会出现如下提示: E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资 ...