您好,Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效。下面关注点在按键特有的部分:
focus
一个拥有焦点(focus)的QWidget才可以接受键盘事件。有输入焦点的窗口是活动窗口或活动窗口子窗口或子子窗口等。
焦点移动的方式有以下几种:
按下Tab或Shift+Tab
注意:文本编译器(一般需要插入Tab),或者WebView(需要Tab来移动超链接焦点) 等
Qt中,需要输入Tab的地方可以用 Ctrl+Tab 或 Ctrl+Shift+Tab 替代。
点击一个QWidget
建议:只对接受文本输入的Widget启用该功能
按下键盘的快捷键
QLabel::setBuddy(), QGroupBox,以及 QTabBar 支持
使用鼠标滚轮
用户移动焦点
程序将决定被设置focus的Widget的哪一个子Widget获得焦点
注意:如果一个 Widget 已经 grabKeyboard,所有键盘事件将发送到该Widget而不是获得焦点的Widget
focusPolicy
一个QWidget获得焦点的方式受 focusPolicy 控制
Qt::TabFocus
通过Tab键获得焦点
Qt::ClickFocus
通过被单击获得焦点
Qt::StrongFocus
可通过上面两种方式获得焦点
Qt::NoFocus
不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点
keypress和keyrelease
首先,我们要是Widget获得焦点,一般设置focusPolicy。
然后要对按键进行响应,我们只需要直接重载:
keyPressEvent
keyReleaseEvent
注意:
对我们不处理的事件,要调用父类的相应事件处理函数。
如果widget当前没有焦点,考虑到事件转发:如果其子widget有焦点,那么该widget未处理的键盘事件将被转发过来。
有时输入焦点不在任何窗口中。这种情况发生在所有程序都是最小化的时候。这时,Windows将继续向活动窗口发送键盘消息,但是这些消息与发送给非最小化的活动窗口的键盘消息有不同的形式。
QKeyEvent
在windows下,与键盘事件有关的有8个消息:
对产生可显示字符的按键组合,Windows不仅给程序发送按键消息,而且还发送字符消息
有些键不产生字符,这些键包括shift键、功能键、光标移动键和特殊字符键如Insert和Delete。对于这些键,Windows只产生按键消息。
这些消息在Qt中只体现在QKeyEvent中。
对字符,可通过 QKeyEvent::text() 获得
其他键,QKeyEvent::key() 获得一个键值
event函数
由于 Tab 键被用来切换焦点,这使得它与众不同。
这是qwidgetcpp的event函数中的代码片段:
case QEvent::KeyPress:
{
QKeyEvent k = (QKeyEvent )event;
bool res = false;
if (!(k->modifiers() & (Qt::ControlModifier | Qt::AltModifier)))
{ //### Add MetaModifier
if (k->key() == Qt::Key_Backtab || (k->key() == Qt::Key_Tab && (k->modifiers() & Qt::ShiftModifier)))
res = focusNextPrevChild(false);
else if (k->key() == Qt::Key_Tab)
res = focusNextPrevChild(true);
if (res)
break;
}
keyPressEvent(k);
}
如果我们需要处理Tab键,需要重载 event 函数。
setStyleSheet("QTabWidget>QTabBar::tab:selected {width: 0px; height: 0px;}"
"QTabWidget>QTabBar::tab:!selected {width: 0px; height: 0px;}");
1、建立起你的QPushButton与i,j的关系,不管什么方法,比如二维数组,Map容器,甚至利用QTableWidget(QPushButton作为QTableWidgetItem放入对应表格)。不过本人建议Map容器,效率会高点,且不会引入表格控件(你未必喜欢那种视觉效果)。
2、对于每个QPushButton对象,
connect(digitalbutton,SIGNAL(clicked()),this,SLOT(getmove())); //digitalbutton对QPushButton进行遍历。
3、getmove()的实现:
void getmove() {
QPushButton digitalbutton = (QPushButton ) sender();
//上文sender()函数参见:>
QToolBox,QTabWidget,QTabBar是通过currentChanged(int)这个signal来得到当前的currentIndex改变的。
Suppose在QToolBox上有3个QToolBoxButton, 每个QToolBoxButton下又有2个item,当我选中第二个QToolBoxButton下的任意一个item的时候,这时候QToolBox的currentIndex是1 这时候再去点击current QToolBoxButton的时候,是没有currentChanged(int) signal发出的。如果我就是想处理点击同一个QToolBoxButton的情况呢?
可能你也想到了,得到QToolBoxButton的指针不就ok了吗?Unfortunately,类似于QTabBar上的Tab这个structure,QToolBox里的QToolBoxButton也是private,我们无法通过“正常途径"得到。
既然此路不通,就另辟蹊径,QObject的函数findChildren()可以出场了。。。
QList<T> QObject::findChildren ( const QString & name = QString() ) const
Returns all children of this object with the given name that can be cast to type T, or an empty list if there are no such objects Omitting the name argument causes all object names to be matched The search is performed recursively
The following example shows how to find a list of child QWidgets of the specified parentWidget named widgetname:
您好,QTabWidget切换Tab的方法很简单,只需要调用QTabWidget的setCurrentIndex()函数即可。比如,如果您想要切换到第二个Tab,只需要调用QTabWidget的setCurrentIndex(1)函数即可。同时,您也可以使用QTabWidget的setTabText()函数来修改Tab的标题,以及使用QTabWidget的setTabIcon()函数来修改Tab的图标。此外,您还可以使用QTabWidget的addTab()函数来添加新的Tab,以及使用QTabWidget的removeTab()函数来删除Tab。总之,QTabWidget提供了一系列的函数来帮助您实现切换Tab的功能,您可以根据自己的需要来使用它们
qtabwidget的核心部件是qtabbar和qstackedwidget。qtabbar就是现实的一串标签,就像你的浏览器显示的标签一样。真正的显示内容的页面都装在qstackedwidget中,这是一个窗口容器。具体的东西你可以看看qt的帮助文件。
以上就是关于Qt如何捕获键盘事件全部的内容,包括:Qt如何捕获键盘事件、QTabWidget怎么样让一个tab隐藏掉、如何实现在一个二维QPushButton中一个button得到clicked时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)