所需待重写函数:

  1. [virtual] bool QObject::eventFilter(QObject *watched, QEvent *event);
  2. /*
  3. * Filters events if this object has been installed as an event filter for the watched object.
  4. * 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.
  5. */

以上来自官方帮助手册

说明:

  1. 通过事件过滤器,即上述重写函数,可通过条件,筛选所需事件
  2. 如果筛选成功,如果此事件后续不再使用,返回true,后续如果再次使用,返回false
  3. 如果筛选不成功,则返回给父类,防止父类处于内部目的重新实现了 eventFilter()

代码示例:

  1. MainWindow.h
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QTableWidget>
  5. #define STANDFLDCOL 0
  6. #define LAYERFLDCOL 1
  7. namespace Ui {
  8. class MainWindow;
  9. }
  10. class MainWindow : public QMainWindow
  11. {
  12. Q_OBJECT
  13. public:
  14. explicit MainWindow(QWidget *parent = 0);
  15. ~MainWindow();
  16. protected:
  17. bool eventFilter(QObject *watched, QEvent *event);
  18. private:
  19. /* init table widget cell data */
  20. void InitCellData();
  21. /* mouse press event */
  22. void MousesPressEvent(QMouseEvent *event);
  23. /* mouse move event */
  24. void MousesMoveEvent();
  25. /* mouse release event */
  26. void MousesReleaseEvent(QMouseEvent *event);
  27. /* exchange cell data between drag cell and drop cell */
  28. void ExchangeData(int oldRow, int oldCol, int newRow, int newCol, QTableWidget *focusTable);
  29. private:
  30. Ui::MainWindow *ui;
  31. int m_selectRow; // drag row
  32. bool m_isPress; // mouse press
  33. bool m_isDrag; // mouse is drag
  34. };
  35. #endif // MAINWINDOW_H

说明:

void InitCellData() : 初始化表格内容

void MousesPressEvent() : 如果事件过滤器中筛选了鼠标左键按下事件,则调用该函数

void MousesMoveEvent() : 如果事件过滤器筛选了鼠标移动事件,则调用该函数

void MousesReleaseEvent() : 如果事件过滤器筛选了鼠标释放事件,则调用该函数

void ExchangeData() : 交换拖拽起始单元格和最终单元格item

  1. MainWindow.cpp
  1. #include "MainWindow.h"
  2. #include "ui_MainWindow.h"
  3. #include <QMouseEvent>
  4. MainWindow::MainWindow(QWidget *parent) :
  5. QMainWindow(parent),
  6. ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. m_isPress = false;
  10. m_isDrag = false;
  11. InitCellData();
  12. }
  13. MainWindow::~MainWindow()
  14. {
  15. ui->tableWidget->clear();
  16. delete ui;
  17. }
  18. void MainWindow::InitCellData()
  19. {
  20. ui->tableWidget->viewport()->installEventFilter(this);
  21. ui->tableWidget->horizontalHeader()->setVisible(false);
  22. ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  23. ui->tableWidget->setColumnCount(2);
  24. ui->tableWidget->setRowCount(15);
  25. for (int i = 0; i < 15; i++)
  26. {
  27. QTableWidgetItem *aitem = new QTableWidgetItem(QString("%1ATime").arg(i));
  28. aitem->setFlags(aitem->flags()&(~Qt::ItemIsEditable));
  29. ui->tableWidget->setItem(i, STANDFLDCOL, aitem);
  30. QTableWidgetItem *bitem = new QTableWidgetItem(QString("%1BTime").arg(i));
  31. bitem->setFlags(bitem->flags()&(~Qt::ItemIsEditable));
  32. ui->tableWidget->setItem(i, LAYERFLDCOL, bitem);
  33. }
  34. }
  35. bool MainWindow::eventFilter(QObject *watched, QEvent *event)
  36. {
  37. if (watched == ui->tableWidget->viewport())
  38. {
  39. QMouseEvent *pEvent = static_cast<QMouseEvent*>(event);
  40. if (event->type() == QEvent::MouseButtonPress)
  41. {
  42. MousesPressEvent(pEvent);
  43. return true;
  44. }
  45. else if (event->type() == QEvent::MouseMove)
  46. {
  47. MousesMoveEvent();
  48. return true;
  49. }
  50. else if (event->type() == QEvent::MouseButtonRelease)
  51. {
  52. MousesReleaseEvent(pEvent);
  53. return true;
  54. }
  55. else return false;
  56. }
  57. return QMainWindow::eventFilter(watched, event);
  58. }
  59. void MainWindow::MousesPressEvent(QMouseEvent *event)
  60. {
  61. if (event->button() == Qt::LeftButton)
  62. {
  63. if (STANDFLDCOL == ui->tableWidget->columnAt(event->x()))
  64. {
  65. return;
  66. }
  67. m_isPress = true;
  68. m_isDrag = false;
  69. m_selectRow = ui->tableWidget->rowAt(event->y());
  70. ui->tableWidget->clearFocus();
  71. }
  72. }
  73. void MainWindow::MousesMoveEvent()
  74. {
  75. if (m_isPress && !m_isDrag)
  76. {
  77. m_isDrag = true;
  78. }
  79. }
  80. void MainWindow::MousesReleaseEvent(QMouseEvent *event)
  81. {
  82. if (m_isPress && m_isDrag)
  83. {
  84. m_isPress = false;
  85. m_isDrag = false;
  86. if (STANDFLDCOL == ui->tableWidget->columnAt(event->x()))
  87. {
  88. return;
  89. }
  90. ExchangeData(m_selectRow, LAYERFLDCOL, ui->tableWidget->rowAt(event->y()), LAYERFLDCOL, ui->tableWidget);
  91. }
  92. }
  93. void MainWindow::ExchangeData(int oldRow, int oldCol, int newRow, int newCol, QTableWidget *focusTable)
  94. {
  95. QTableWidgetItem *oldItem = focusTable->takeItem(oldRow, oldCol);
  96. QTableWidgetItem *newItem = focusTable->takeItem(newRow, newCol);
  97. focusTable->setItem(oldRow, oldCol, newItem);
  98. focusTable->setItem(newRow, newCol, oldItem);
  99. }

说明:

限制拖拽列只能为第2列(可进行修改)

限值不同列之间不能进行拖拽(可进行修改)

QT之——QTableWidget拖拽单元格并替换内容(进阶)的更多相关文章

  1. C# Winform ListView实现单元格双击复制内容到剪贴板

    private void listView_MouseDoubleClick(object sender, MouseEventArgs e) { ListView listview = (ListV ...

  2. (很难啊)如何实时获取DBGrid 中当前单元格输入的内容? [问题点数:100分,结帖人yifawu100]

    如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理,用什么事件呢? 所以Field的Onchange事件是没用的. DBGrid1.Selec ...

  3. excel判断单元格包含指定内容的函数用=IF(COUNTIF(A1,"*内容*"),"0","1")

    前面我们聊过怎样将Excel包含某字符的单元格填充颜色,这边我们用另外一种方法来实现:excel判断单元格包含指定内容的函数 选中需要显示结果的单元格,假设我们要判断第一行第一列的单元格A1是否含有“ ...

  4. 如何实时获取DBGrid 中当前单元格输入的内容?

    如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理, 用什么事件呢? 所以Field的Onchange事件是没用的. 这个问题简单啊,每输入1 ...

  5. JS去遍历Table的所有单元格中的内容

    用JS去遍历Table的所有单元格中的内容,可以用如下JS代码实现 function GetInfoFromTable(tableid) { var tableInfo = ""; ...

  6. excel用函数去掉单元格内容中的括号,并只保留单元格里面的内容

    1.substitute(需要执行替换操作的单元格,需要替换的字符,替换后的字符,有多个需要替换的字符可以指定替换的第几个) 例如:aab--substitute("aab",&q ...

  7. Qt 无边框拖拽实现

    Qt 无边框拖拽实现 头文件定义: class TDragProxy:public QObject { Q_OBJECT public: TDragProxy(QWidget* parent); ~T ...

  8. qt中的拖拽及其使用技巧

    关于qt中的拖放操作,首先可以看这篇官方文档:http://doc.qt.io/qt-5.5/dnd.html 一.QDrag 首先是创建QDrag,可以在mousePressEvent或者mouse ...

  9. Qt中由表中单元格的QModelIndex获取Global Pos的正确方法

    一直在尝试从单元格的行列索引(QModelIndex)获取其单元格的全局坐标(Global Pos)的方法,以期待在指定单元格附近弹出帮助信息.由View中的columnViewportPositio ...

随机推荐

  1. 转【深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接】

    转自:https://www.jb51.net/article/39432.htm 1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     ...

  2. JAVA基础--数据类型和运算符总结

    一,JAVA的数据类型 逻辑型----boolean 只允许取值true和false 字符型----char java采用unicode编码(utf16),每个字符占用两个字节 整数型----byte ...

  3. editmd输出到前端显示

    官方案例:html-preview-markdown-to-html.html 输出后台数据显示在前端,格式化内容<!DOCTYPE html> <html lang="z ...

  4. Redis底层数据结构实现

    REDIS  较宽泛的支持5种数据结构  分别为 字符串 列表 集合 散列 有序集合 关于这几种数据结构的使用 相信网上有很多资料,查看官网API 也很详细了  读者可以自己随意翻阅 很方便 . 接下 ...

  5. Java8的Optional:如何干掉空指针?

    目录 Optional概述 Optional简单案例 Optional的主要方法 参考阅读 Optional概述 Optional 是个容器:它可以保存类型T的value,或者仅仅保存null.Opt ...

  6. post传参数 传json格式参数

    如下: const dataObject = JSON.stringify({                                         "base64str" ...

  7. 安卓mbn文件丢失,无法搜索移动信号,工程模式mbn乱改,不用QPST烧录怎样恢复?超简单!

    没有root,工程模式乱改mbn配置选项,导致mbn配置丢失,无法搜索移动网络. 重启若干次改配置都无效,清空网络设置无效,恢复出厂无效,recovery三清无效, 不太想拆机root麻烦,QPST配 ...

  8. 瞄到BindingGroup用法

    文章转载于https://www.cnblogs.com/dangnianxiaoqingxin/p/12653988.html 2.BindingGroup的使用 public class MyCl ...

  9. Mac安装mysqlclient

    前言 祝大家身体健康 正文 如何在Mac上安装Python的mysqlclient模块 安装mysql brew install mysql 安装mysql-client brew install m ...

  10. 【MyBatis】MyBatis 动态 SQL

    MyBatis 动态SQL if 可以根据实体类的不同取值,使用不同的 SQL 语句来进行查询. 使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分. 持久层 DAO 接口: pub ...