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 ...
随机推荐
- 死磕以太坊源码分析之MPT树-下
死磕以太坊源码分析之MPT树-下 文章以及资料请查看:https://github.com/blockchainGuide/ 上篇主要介绍了以太坊中的MPT树的原理,这篇主要会对MPT树涉及的源码进行 ...
- 2021.Jan.11.Mon
人生中的机会不会有很多次,把每一次机会都当作最后一次机会,全力以赴地去做好,那么,你就不会永远在等待下一个机会. 看书心得---------By VincentAdamNemessis ...
- 【递归】P1706全排列问题
题目相关 题目描述 输出自然数 1 到 n所有不重复的排列,即 n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入格式 一个整数 n**. 输出格式 由 1∼n 组成的所有不重复的数字 ...
- WPF TreeView Indent 减少节点的缩进
www.swack.cn - 原文链接:WPF TreeView Indent 减少节点的缩进 问题 最近一个需求,需要在界面中实现Windows资源管理器TreeView的界面.但是我发现,我做出的 ...
- 【Java基础】Java10 新特性
Java10 新特性 局部变量类型推断 局部变量的显示类型声明,常常被认为是不必须的. 场景一:类实例化时.在声明一个变量时,总是习惯了敲打两次变量类型,第一次用于声明变量类型,第二次用于构造器. 场 ...
- 实现strStr
Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...
- 微软官网下载win10离线介质
1.打开google浏览器 2.搜索win10官网下载或者直接输入网址https://www.microsoft.com/zh-cn/software-download/windows10 3.按F1 ...
- HTML&CSS:构建网站不能不说的那些事儿
很高兴你能看到这个专栏!俗话说得好,相逢即是缘分,没准你和我在上一世也曾有过五百次的回眸,才得此一面.说的有点恶心了,咱还是书归正传,说说这个专栏吧. 这个专栏主要讲的是 HTML 和 CSS 的页面 ...
- 03--Docker 容器和镜像常用命令
一.帮助命令 docker version docker info docker --help =====================镜像命令=========================== ...
- floating point
记录浮点数的单精度和双精度(IEEE754) 1.单精度(float) 1.定义:单精度占4字节/32位,其中1号位符号位,其次是8位阶码/指数(阶符+阶数),23位尾数(小数). 2.双精度(d ...