当用户在QTableWidget中使用键盘(Key_Up和Key_Down)更改行时发出信号

时间:2016-05-19 12:27:55

标签: c++ qt

当用户通过在QTableWidget中按向上或向下箭头键更改键盘行时,我不知道如何发出信号。之后,我将不得不使用此信号对我的视频进行一些更改。

我该如何实现?

3 个答案:

答案 0 :(得分:1)

通过添加两个信号对类QTableWidget进行子类化:

class myTableWidget: public QTableWidget
{
  public:
    myTableWidget() {}
    ~myTableWidget() {}

  private:
   void keyPressEvent(QKeyEvent* event)
   {
        if(event->key() == Qt::Key_Up)
            emit keyUpPressed();
        else if(event->key() == Qt::Key_Down)
            emit keyDownPressed();    
        else
            QWidget::keyPressEvent(event);
    }

    signals :
        keyUpPressed();
        keyDownPressed();
}; 

在您使用该视频的班级中,添加两个插槽(假设您的班级名为yourClass

public slots :
    void onKeyUpPressed();
    void onKeyDownPressed();

现在您可以使用主类中的信号和插槽连接,如下所示:

myTableWidget* table = new myTableWidget();
connect(table, SIGNAL(keyUpPressed()), this, SLOT(onKeyUpPressed()));
connect(table, SIGNAL(keyDownPressed()), this, SLOT(onKeyDownPressed()));

然后,在您的广告位中,您可以处理您的视频。

void yourClass::onKeyUpPressed()
{
    // do something here
}

void yourClass::onKeyDownPressed()
{
    // do something else here
}

另一种方法是安装event filter

您的评论中的

编辑,您的班级会继承QStyledItemDelegate,因此您可以像这样覆盖函数eventFilter

bool myTableWidget::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() == QEvent::KeyPress) 
    {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        if (keyEvent->key() == Qt::Key_Up)
            emit keyUpPressed();
        else if(event->key() == Qt::Key_Down)
            emit keyDownPressed(); 
    }
    // standard event processing
    return QStyledItemDelegate::eventFilter(obj, event);
}

然后,yourClass中的广告位也是如此。

答案 1 :(得分:1)

要从关键事件中捕获信号,您可以继承QTableWidget并覆盖方法keyPressEvent(QKeyEvent *event),例如:

.H文件:

class CustomTableWidget : public QTableWidget
{
    Q_OBJECT
protected:
    void keyPressEvent(QKeyEvent *event);
public:
    explicit CustomTableWidget(QWidget *parent = 0);
    ~CustomTableWidget();

signals:
    void upEvent(const QModelIndex &index);
    void downEvent(const QModelIndex &index);

.CPP文件:

void CustomTableWidget::keyPressEvent(QKeyEvent *event)
{
    switch(event->key()) {
    case Qt::Key_Up: emit upEvent(currentIndex());
        break;
    case Qt::Key_Down: emit downEvent(currentIndex());
        break;
    default: QTableWidget::keyPressEvent(event);
    }
}

答案 2 :(得分:0)

您可能希望连接到信号currentCellChanged这将处理鼠标点击和键盘移动,并为您提供新选择的单元格的索引。