如何使用Qt聚焦menuBar()

时间:2015-01-13 18:25:47

标签: c++ qt menu focus menubar

我有一个有效的应用程序。我在主窗口中添加了一个带有一些菜单的menuBar()。然后,我把它隐藏到了屏幕空间。我编写了下面的代码,以便当用户按下ALT键时,如果隐藏了菜单栏,则会显示该菜单栏,如果显示它则隐藏它。

void MainWindow::keyPressEvent( QKeyEvent *k ) {
    if(k->modifiers() & Qt::AltModifier) {
        menuBar()->setHidden(!menuBar()->isHidden());
        if(menuBar()->hasFocus()) {
            QMessageBox::information(this, "Info", "Focus !");
        }
    }
}

如您所见,我还添加了一个QMessageBox,以查看menuBar何时具有焦点。这个盒子只出现了一半的时间。它是这样的:

  1. 推出应用程序,菜单栏隐藏
  2. 我按ALT,显示菜单栏,没有消息框,没有焦点
  3. 我按ALT,菜单栏隐藏
  4. 我按ALT,显示菜单栏,消息框,焦点
  5. 我按ALT,菜单栏隐藏
  6. 我按ALT,显示菜单栏,没有消息框,没有焦点
  7. 我按ALT,菜单栏隐藏
  8. 我按ALT,显示菜单栏,消息框,焦点
  9. 如何确保何时显示menuBar,它始终具有焦点?

2 个答案:

答案 0 :(得分:1)

我想做同样的事情。我的解决方案,完整的例子,作为一个要点:

https://gist.github.com/xim/ee56564f425151ea2fa70f730d644873

对Qt 5.9.4进行了测试。

因为它包含很多其他垃圾,一个最小的例子:

 # foreach perl app in the src/perl dir
 while read -r dir ; do

  echo -e "\n"
  echo "start compiling $dir ..." ;
  cd $product_instance_dir/src/perl/$dir ;

  # run the autoloader utility
    find . -name '*.pm' -exec perl -MAutoSplit -e 'autosplit($ARGV[0], $ARGV[1], 0, 1, 1)' {} \;

       # foreach perl file check the syntax by setting the correct INC dirs
     while read -r file ; do
        perl -MCarp::Always -I `pwd` -I `pwd`/lib -wc "$file"
        # run the perltidy inline
        # perltidy -b "$file"
        # sleep 3
        ret=$? ;
        test $ret -ne 0 && break 2 ;
     done < <(find "." -type f \( -name "*.pl" -or -name "*.pm" \))

     test $ret -ne 0 && break ;

     echo "stop compiling $dir ..." ;
     echo -e "\n\n"
     cd $product_instance_dir ;

 done < <(ls -1 "src/perl")

答案 1 :(得分:0)

您是否尝试过添加setFocus命令?

void MainWindow::keyPressEvent( QKeyEvent *k ) {
    if(k->modifiers() & Qt::AltModifier) {
        menuBar()->setHidden(!menuBar()->isHidden());
        menuBar()->setFocus(Qt::MenuBarFocusReason);
        if(menuBar()->hasFocus()) {
            QMessageBox::information(this, "Info", "Focus !");
        }
    }
}