如何从键盘为QTableWidget创建信号?
我有一张桌子,里面有左、右、上、下按钮。现在我需要创建一个信号,当我停留在某个单元格并按下空格键时。该信号还应带来该单元的坐标。我尝试使用QTableWidget的标准信号,但它不起作用。如何解决此问题?创建一个单独的头文件,即“customtable.h”,然后在设计器中,您可以将现有的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
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好的,谢谢,我已经对我的答案进行了编辑