【QT】如何让QWidget接收键盘事件

【QT】如何让QWidget接收键盘事件,第1张

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 控制,setFocusPolicy(Qt::StrongFocus);Qt::TabFocus通过Tab键获得焦点Qt::ClickFocus通过被单击获得焦点Qt::StrongFocus可通过上面两种方式获得焦点Qt::NoFocus不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点 keypress和keyrelease 首先,我们要是Widget获得焦点,一般设置focusPolicy。 然后要对按键进行响应,我们只需要直接重载:keyPressEventkeyReleaseEvent 注意:对我们不处理的事件,要调用父类的相应事件处理函数。 如果widget当前没有焦点,考虑到事件转发:如果其子widget有焦点,那么该widget未处理的键盘事件将被转发过来。 有时输入焦点不在任何窗口中。这种情况发生在所有程序都是最小化的时候。这时,Windows将继续向活动窗口发送键盘消息,但是这些消息与发送给非最小化的活动窗口的键盘消息有不同的形式。 QKeyEvent 在windows下,与键盘事件有关的有8个消息:对产生可显示字符的按键组合,Windows不仅给程序发送按键消息,而且还发送字符消息 有些键不产生字符,这些键包括shift键、功能键、光标移动键和特殊字符键如Insert和Delete。对于这些键,Windows只产生按键消息。 这些消息在Qt中只体现在QKeyEvent中。对字符,可通过 QKeyEvent::text() 获得其他键,QKeyEvent::key() 获得一个键值实际程序:public: void keyPressEvent(QKeyEvent event);在相应键盘事件之前需要 用一个widget 进行设置 LabelComment->setFocusPolicy(Qt::StrongFocus);void CameraShow::keyPressEvent(QKeyEvent event) { if(event->key()==Qt::Key_Q) { Pause_flag ^= 1; }}

pos()函数就能解决问题,能够返回坐标点QPoint

如果有父窗口的话,你先试试mapToParent(),返回在父窗口中的坐标,然后再

mapToGlobal(),你试试,我现在没空弄这个,如果还不行的话,我再想想

功能:窗口最小化后或者点击“hide”按钮将窗口隐藏到托盘

通常最小化的窗口会在任务栏上显示一个按钮。当用户按一下这个按钮,窗口就还原了。这是一个被大多数桌面环境,比如Windows,KDE,GNOME所采用的普遍设计。不过,因为任务栏通常只是桌面边上一小行,容纳不了很多按钮,用户通常希望把那些不常用的程序隐藏起来,只在通知栏显示一个小图标,要使用的时候再点击那个小图标恢复窗口。这种作法最典型的例子是QQ和Winamp。

最基本的思路是拦截窗口的最小化事件changeEvent(),通过重写changeEvent()即可。

“hide”按钮的方式,是通过信号--槽来实现。

--------------------------------------------------------------------

void TrayMenu::createActions()

{

//创建托盘项

action_show = new QAction(this);

action_quit = new QAction(this);

action_login_home = new QAction(this);

action_help = new QAction(this);

action_about = new QAction(this);

action_check_update = new QAction(this);

action_setting = new QAction(this);

//设置托盘项图标

action_show->setIcon(QIcon(":/icon/open"));

action_login_home->setIcon(QIcon(":/icon/home"));

action_help->setIcon(QIcon(":/icon/help"));

action_about->setIcon(QIcon(":/icon/about"));

action_check_update->setIcon(QIcon(":/icon/update"));

action_setting->setIcon(QIcon(":/icon/set"));

action_quit->setIcon(QIcon(":/icon/quit"));

//加载和提示

QIcon icon(":/images/sysTraypng");

systemTray = new QSystemTrayIcon(this);

systemTray->setIcon(icon);

systemTray->setToolTip("Hello, this is system tray!");

注意:这里特别提醒,如果你的应用程序要移植到别的机器上,而且这个机器没有装Qt,QIcon的格式最好用png,而不要用ico等格式,否则托盘图标不能显示,会很麻烦。

//设置托盘想文本

action_show->setText(QString("显示"));

action_quit->setText(QString("退出"));

action_login_home->setText(QString("登录网页"));

action_help->setText(QString("帮助"));

action_about->setText(QString("关于"));

action_check_update->setText(QString("检查更新"));

action_setting->setText(QString("设置"));

//添加菜单项

this->addAction(action_show);

this->addAction(action_setting);

this->addAction(action_login_home);

this->addSeparator();

this->addAction(action_help);

this->addAction(action_about);

this->addAction(action_check_update);

this->addSeparator();

this->addAction(action_quit);

action_setting->setVisible(false);

//设置信号连接(这里仅列举连接显示窗口的信号)

QObject::connect(action_show, SIGNAL(triggered(bool)), this, SIGNAL(showWidget()));

}

LoginDialog::LoginDialog(QWidget parent) : QDialog(parent)

{

QSystemTrayIcon system_tray = new QSystemTrayIcon();

//放在托盘提示信息、托盘图标

system_tray ->setToolTip(QString("我就是托盘"));

system_tray ->setIcon(QIcon(":/icon/login"));

TrayMenu tray_menu = new TrayMenu();

system_tray->setContextMenu(tray_menu);

//点击托盘执行的事件

connect(system_tray , SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconIsActived(QSystemTrayIcon::ActivationReason)));

connect(tray_menu, SIGNAL(showWidget()), this, SLOT(showNormal()));

//显示托盘

system_tray->show();

//托盘显示提示信息

system_tray->showMessage(QString("托盘标题"), QString("托盘显示内容"));

}

void LoginDialog::iconIsActived(QSystemTrayIcon::ActivationReason reason)

{

switch(reason)

{

//点击托盘显示窗口

case QSystemTrayIcon::Trigger:

{

showNormal();

break;

}

//双击托盘显示窗口

case QSystemTrayIcon::DoubleClick:

{

showNormal();

break;

}

default:

break;

}

}

OK,这样我们的托盘功能就Over了!

=============================================================================

另://关闭到托盘

void Widget::closeEvent(QCloseEvent e)

{

e->ignore();

this->hide();

}

void Widget::keyPressEvent(QKeyEvent event)

{

switch (event->key())

{

case Qt::Key_Return:

focusNextPrevChild(true);

break;}

}

focusNextPrevChild(true);这是选下一个焦点的,返回当前的就在这附近,你帮助里找下,我就帮你找了。

以上就是关于【QT】如何让QWidget接收键盘事件全部的内容,包括:【QT】如何让QWidget接收键盘事件、Qt中如何获取一个子窗口相对于屏幕的绝对坐标、QT如何获取最小化事件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9410508.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存