如何从键盘为 QTableWidget 创建信号?
How to create a SIGNAL for QTableWidget from keyboard?
我有一个 table 并使用向左、向右、向上、向下按钮在内部移动。现在我需要在我停留在某个单元格中并按下 SPACE 按钮时创建一个 SIGNAL。这个信号也应该带来那个细胞的坐标。我尝试使用 QTableWidget 的标准信号,但它不起作用。我该如何解决?
创建一个单独的头文件,即 "customtable.h",然后在设计器中您可以将现有的 QTableWidget 提升到此 class。
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);
我有一个 table 并使用向左、向右、向上、向下按钮在内部移动。现在我需要在我停留在某个单元格中并按下 SPACE 按钮时创建一个 SIGNAL。这个信号也应该带来那个细胞的坐标。我尝试使用 QTableWidget 的标准信号,但它不起作用。我该如何解决?
创建一个单独的头文件,即 "customtable.h",然后在设计器中您可以将现有的 QTableWidget 提升到此 class。
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);