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 ...
随机推荐
- [leetcode]207. Course Schedule课程表
在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为0的节点),然后把它指向其他节点的边都去掉,重复这个过程(BFS),直到所有节点已被找到,或者没有符合条件的节点(如果图中有环存在). /* ...
- GraduateDesign-给APP添加获取位置信息和天气预报的功能(json)
首先,我的app需要通过网络来获取当前所在的位置.这里我找到了一个json来获取本地位置信息. http://int.dpool.sina.com.cn/iplookup/iplookup.php?f ...
- 图解 Java 数据结构
图解Java数据结构: 一.链表 Java ListNode https://www.cnblogs.com/easyidea/p/13371863.html 二.栈 ...
- SpringBoot全局异常拦截
SpringBoot全局异常捕获 使用到的技能 @RestControllerAdvice或(@ControllerAdvice+@ResponseBody) @ExceptionHandler 代码 ...
- 什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?
内容传送网络或内容分发网络(CDN)是部署在因特网上的多个数据中心的大型分布式服务器系统.CDN的目标是为具有高可 用性和高性能的最终用户提供内容. 有3个流行的jQuery CDN:谷歌,微软jQu ...
- JavaDailyReports10_11
********************************** 验证码 AWT Swing 1 package nanshen; 2 3 import java.awt.Container; 4 ...
- JAVA编程能力提升学习图
阿里大神毕玄整理的关于进阶JAVA的学习体系,知道下...
- 浅入kubernetes(2):Kubernetes 的组成
目录 说明 Kubernetes集群的组成 What are containerized applications? What are Kubernetes containers? What are ...
- java注解学习笔记总结
注解的理解 ① jdk 5.0 新增的功能 ② Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理.通过使用 Annotation,程序 ...
- Sublime Text 3 习惯插件 转
原帖:https://www.cnblogs.com/hykun/p/sublimeText3.html Emmet插件 Emmet插件可以说是使用Sublime Text进行前端开发必不可少的插件 ...