• 7169阅读
  • 8回复

[讨论]QAction一定要放在menubar中才能出发shortcut吗? [复制链接]

上一主题 下一主题
离线jemyzhang
 

只看楼主 倒序阅读 楼主  发表于: 2013-12-12
Qt5.1
QAction如果放在contextMenu中,setShortcut没有效果。加入menubar才能够触发shortcut。


请问是否这样?右键菜单中的action设置的shortcut是否就一定没有用?
离线dbzhang800

只看该作者 1楼 发表于: 2013-12-12
不清楚你如何得出的这种结论。

据我所知,QAction的shortcut不光在context Menu可以起作用,而是,“在任何一个QWidget及其派生类中,QAction的shortcut都可以起作用”
离线jemyzhang

只看该作者 2楼 发表于: 2013-12-12
引用第1楼dbzhang800于2013-12-12 13:50发表的  :
不清楚你如何得出的这种结论。
据我所知,QAction的shortcut不光在context Menu可以起作用,而是,“在任何一个QWidget及其派生类中,QAction的shortcut都可以起作用”

以下是我的测试代码, ui->menuBar->addAction(m_act); //如果不加这一行,快捷键不起作用

  1. MainWindow::MainWindow(QWidget *parent) :
  2.     QMainWindow(parent),
  3.     ui(new Ui::MainWindow)
  4. {
  5.     ui->setupUi(this);
  6.     ui->textEdit->setContextMenuPolicy(Qt::CustomContextMenu);
  7.     connect(ui->textEdit,SIGNAL(customContextMenuRequested(QPoint)),
  8.             this,SLOT(showContextMenu(QPoint)));
  9.     m_act = new QAction("&Paste",this);
  10.     m_act->setShortcut(tr("Ctrl+D"));
  11.     connect(m_act, SIGNAL(triggered()),this, SLOT(PasteContent()));
  12.     ui->menuBar->addAction(m_act);
  13. }
  14. MainWindow::~MainWindow()
  15. {
  16.     delete ui;
  17. }
  18. void MainWindow::showContextMenu(QPoint pt)
  19. {
  20.     QMenu *menu = ui->textEdit->createStandardContextMenu();
  21.     menu->addSeparator();
  22.     menu->addAction(m_act);
  23.     menu->exec(mapToGlobal(pt));
  24.     delete menu;
  25. }
  26. void MainWindow::PasteContent()
  27. {
  28.     QString txt = QApplication::clipboard()->text();
  29.     ui->textEdit->setText(txt);
  30. }


离线dbzhang800

只看该作者 3楼 发表于: 2013-12-12
是的,你必须将QAction加入到一个QWidget或其派生类的对象中。

在你的例子中,你完全也可以 this->addAction(m_act) 嘛
离线jemyzhang

只看该作者 4楼 发表于: 2013-12-12
引用第3楼dbzhang800于2013-12-12 16:28发表的  :
是的,你必须将QAction加入到一个QWidget或其派生类的对象中。
在你的例子中,你完全也可以 this->addAction(m_act) 嘛

果然可以,你太棒了!非常感谢!
离线dbzhang800

只看该作者 5楼 发表于: 2013-12-12
题外,如果你只需要快捷键的话,直接用 QShortcut 就行了,没必要用QAction进行一下中转
离线rpdhunter

只看该作者 6楼 发表于: 2013-12-13
回 5楼(dbzhang800) 的帖子
不愧是版主啊,厉害

只看该作者 7楼 发表于: 2013-12-13
回 楼主(jemyzhang) 的帖子
已测!重写右键菜单快捷键不起作用。。。只有点击鼠标才会调用槽函数!

测试:QTableView 实现右键菜单!

方法如下:
void contextMenuEvent(QContextMenuEvent *event)

菜单项如下:
action_create_folder = new QAction(this);
action_create_folder->setShortcut(tr("Ctrl+D"));
connect(action_create_folder, SIGNAL(triggered()),this, SLOT(testShortcut()));

槽函数如下:
void testShortcut()
{
    QMessageBox::information(NULL, "test", "test shortcut");
}

如下:




可以参考一下,不是一两个人遇到类似的问题,说可以的请测试一下!技术重在讨论。。。
http://www.qtcentre.org/threads/17457-Shortcut-key-for-context-menu.
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线lwg82

只看该作者 8楼 发表于: 2021-06-25
今天我也遇到了,必须将QAction加入到一个QWidget或其派生类的对象中。
快速回复
限100 字节
 
上一个 下一个