将shift-click修饰符实现到特定的表单窗口小部件?

时间:2016-10-25 22:46:53

标签: c++ qt

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

示例:

myApplication.cpp中,我有这段代码:

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

这与我想要的相似,但并不完全相同。我的想法是让QTableView小部件名为tableView(包含在我在Qt Designer中创建的主应用程序中),以便在我按住{{1}时禁用表的排序功能并左键单击列标题。 (最终目标是使Shift +点击将暂时禁用列排序,这样我就可以选择列中的所有项目而不是对列进行排序)。

上面的代码只有在我按住Shift键并单击主应用程序的最底部时(在没有其他小部件的空间中)才有效。那讲得通。但是,如何在Shift窗口小部件内执行Shift +单击会触发tableView行?

我想要类似的东西:(伪代码):

qDebug() << "shift modifier";

我该怎么做?

编辑:研究让我相信我可以使用可以针对特定小部件的事件过滤器来做到这一点。我是在正确的轨道上吗?

编辑2:感谢下面的goug的回答,我能够通过继承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); } } } 然后宣传我现有的表格QTableView来完成我的需要。 1}}到新班级。见下文:

mytableview.h

QTableView

mytableview.cpp

#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

1 个答案:

答案 0 :(得分:3)

您可以在这里使用几种不同的方法。您可以继承QTableView,然后在Qt Designer中,您可以正常放置QTableView,然后将其提升为派生类。生成的代码创建了类的实例而不是QTableView。在Qt Designer中,右键单击表视图,然后从“提升”选项中进行选择。您必须在第一时间输入课程详细信息。我倾向于走这条路线,特别是如果你想在桌面视图上实现其他自定义行为。

另一种选择是创建一个新类并将其作为事件过滤器安装在QTableView上。然后,您的新班级会在他们前往QTableView之前获取事件,您可以根据他们采取相应行动。在Qt Assistant中查找installEventFilter,这将让您了解如何执行此操作的详细信息。