如何从键盘为QTableWidget创建信号?

如何从键盘为QTableWidget创建信号?,qt,keypress,signals-slots,qtablewidget,Qt,Keypress,Signals Slots,Qtablewidget,我有一张桌子,里面有左、右、上、下按钮。现在我需要创建一个信号,当我停留在某个单元格并按下空格键时。该信号还应带来该单元的坐标。我尝试使用QTableWidget的标准信号,但它不起作用。如何解决此问题?创建一个单独的头文件,即“customtable.h”,然后在设计器中,您可以将现有的QTableWidget升级到此类 class customTable:public QTableWidget { Q_OBJECT public: customTable(QWidge

我有一张桌子,里面有左、右、上、下按钮。现在我需要创建一个信号,当我停留在某个单元格并按下空格键时。该信号还应带来该单元的坐标。我尝试使用QTableWidget的标准信号,但它不起作用。如何解决此问题?

创建一个单独的头文件,即“customtable.h”,然后在设计器中,您可以将现有的QTableWidget升级到此类

class customTable:public QTableWidget
{
   Q_OBJECT
   public:
      customTable(QWidget* parent=0):QTableWidget(parent){}       
   protected:
      void keyPressEvent(QKeyEvent *e)
      {
         if(e->key()==Qt::Key_Space)
         {
            emit spacePressed(this->currentRow(),this->currentColumn());
         }
         else { QTableWidget::keyPressEvent(e); }
      }
   signals:
      spacePressed(int r, int c);
};

可以使用事件筛选器执行以下操作:

class TableSpaceWatcher : public QObject {
  Q_OBJECT
  bool eventFilter(QObject * receiver, QEvent * event) override {
    auto table = qobject_cast<QTableWidget*>(receiver);
    if (table && event->type() == QEvent::KeyPress) {
       auto keyEvent = static_cast<QKeyEvent*>(event);
       if (keyEvent->key() == Qt::Key_Space)
          emit spacePressed(table->currentRow(), table->currentColumn());
    }
    return false;
  }
public:
  using QObject::QObject;
  Q_SIGNAL void spacePressed(int row, int column);
  void installOn(QTableWidget * widget) {
     widget->installEventFilter(this);
  }
};

QTableWidget table;
TableSpaceWatcher watcher;
watcher.installOn(&table);
class TableSpaceWatcher:公共QObject{
Q_对象
布尔事件过滤器(QObject*接收器,QEvent*事件)覆盖{
自动表格=qobject_cast(接收器);
if(表和事件->类型()==QEvent::KeyPress){
auto keyEvent=静态施法(事件);
if(keyEvent->key()==Qt::key\u Space)
emit spacePressed(表->当前行(),表->当前列());
}
返回false;
}
公众:
使用QObject::QObject;
Q_信号无效空格按下(int行,int列);
void installOn(QTableWidget*widget){
小部件->安装事件过滤器(此);
}
};
QTableWidget表;
表空间观察者;
watcher.installOn(&table);

当您在正确的单元格上且
QKeyEvent
空格
时,尝试通过重新实现来实现它,发送您的信号。@ThibautB。是的,我已经考虑过了,但仍然不知道如何发送单元格的坐标。使用,您会得到一个
QModelIndex
,因此您有
行和
列。谢谢。我想我应该在这里添加
else{QTableWidget::keyPressEvent(event);}
。否则其他按钮不起作用:)@htmlamateur好的,谢谢,我已经对我的答案进行了编辑