Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对特定表单小部件实现shift-click修改器?_C++_Qt - Fatal编程技术网

C++ 对特定表单小部件实现shift-click修改器?

C++ 对特定表单小部件实现shift-click修改器?,c++,qt,C++,Qt,如果我在应用程序的主窗口中使用Qt Designer,并且应用程序中包含许多不同的小部件,那么如何进一步定制这些小部件?例如,我的主应用程序中有一个QTableView小部件。调试应用程序后,将从Qt Designer.ui表单创建一个ui_myapplication.h文件。假设我想向该文件中定义的小部件添加一些额外的东西。如果它是在运行时创建的,我会怎么做 例如: 在myApplication.cpp中,我有以下代码块: void myApplication::mousePressEvent

如果我在应用程序的主窗口中使用Qt Designer,并且应用程序中包含许多不同的小部件,那么如何进一步定制这些小部件?例如,我的主应用程序中有一个QTableView小部件。调试应用程序后,将从Qt Designer.ui表单创建一个ui_myapplication.h文件。假设我想向该文件中定义的小部件添加一些额外的东西。如果它是在运行时创建的,我会怎么做

例如:

在myApplication.cpp中,我有以下代码块:

void myApplication::mousePressEvent(QMouseEvent* event) {
  if(event->modifiers() & Qt::ShiftModifier) {
    if(event->button() == Qt::LeftButton) {
      qDebug() << "shift modifier";
      ui->tableView->setSortingEnabled(false);
    }
  }
}
我该怎么做

编辑:研究让我相信我可以用一个事件过滤器来实现这一点,它可以针对特定的小部件。我走对了吗

编辑2:多亏了goug下面的回答,我能够通过子类化QTableView并将现有表单的QTableView升级到新类来完成我所需要的。见下文:

mytableview.h

mytableview.cpp


这里有几种不同的方法可以使用。您可以将QTableView子类化,然后在Qt设计器中,将QTableView作为普通类放置,然后将其升级到派生类。生成的代码创建类的实例,而不是QTableView。在Qt Designer中,右键单击表视图并从升级选项中选择。您必须在第一次输入您的课堂详细信息。我倾向于走这条路,尤其是如果您希望在表视图上实现其他自定义行为


另一个选项是创建一个新类,并将其作为事件过滤器安装在QTableView上。然后,您的新类在事件进入QTableView之前获取事件,您可以对它们采取相应的行动。在Qt Assistant中查找installEventFilter,这将使您了解如何执行此操作的详细信息

这里有几种不同的方法可以使用。您可以将QTableView子类化,然后在Qt设计器中,将QTableView作为普通类放置,然后将其升级到派生类。生成的代码创建类的实例,而不是QTableView。在Qt Designer中,右键单击表视图并从升级选项中选择。您必须在第一次输入您的课堂详细信息。我倾向于走这条路,尤其是如果您希望在表视图上实现其他自定义行为


另一个选项是创建一个新类,并将其作为事件过滤器安装在QTableView上。然后,您的新类在事件进入QTableView之前获取事件,您可以对它们采取相应的行动。在Qt Assistant中查找installEventFilter,这将使您了解如何执行此操作的详细信息

非常感谢你!使用您的答案作为起点,我还发现在子类化方面,此资源很有价值:。我还将在编辑部分为原始问题添加一个更完整的答案。非常感谢!使用您的答案作为起点,我还发现在子类化方面,此资源很有价值:。我还将在编辑部分为原始问题添加一个更完整的答案。
void myApplication::mousePressEvent(QMouseEvent* event) {
  if(target == ui->tableView->horizontalheader() && event->modifiers() & Qt::ShiftModifier) {
    if(event->button() == Qt::LeftButton) {
      qDebug() << "shift modifier";
      ui->tableView->setSortingEnabled(false);
    }
  }
}
#ifndef MYTABLEVIEW_H
#define MYTABLEVIEW_H

#include "mytableview.h"
#include <QTableView>

class MyTableView : public QTableView
{
  Q_OBJECT

public:
  explicit MyTableView(QWidget * parent = 0);

  ~MyTableView();

protected:
  void mousePressEvent(QMouseEvent *event);

};

#endif // MYTABLEVIEW_H
#include "mytableview.h"
#include <QDebug>

MyTableView::MyTableView(QWidget* parent)
{
}

MyTableView::~MyTableView()
{
}

void MyTableView::mousePressEvent(QMouseEvent* event) {
  if(event->modifiers() & Qt::ShiftModifier) {
      if(event->button() == Qt::LeftButton) {
        qDebug() << "shift modifier";
        setSortingEnabled(false);
      }
  }
}