QAction vs QToolButton以及何时覆盖Basic类?

时间:2012-02-18 16:25:50

标签: qt

我最近一直在研究Qt,并提出以下问题:

  1. QActionQToolButton之间有什么区别?
  2. 我如何知道何时覆盖QPushButton?例如,我应该覆盖以便在鼠标进入QPushButton的界限时获得通知吗?我无需获取signal click()

1 个答案:

答案 0 :(得分:8)

问题1:

QAction用于以一种可被许多不同用户界面对象理解的方式定义应用程序执行的任务。使用example from the Qt docs作为上下文:

定义了QAction;它被赋予图标图像,文本描述,键盘快捷键和更长的工具提示描述,以及链接到用户定义的功能。

newAct = new QAction(QIcon(":/images/new.png"), tr("&New"), this);
newAct->setShortcuts(QKeySequence::New);
newAct->setStatusTip(tr("Create a new file"));
connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));

在实施的后期,QAction被添加到文本菜单栏...

fileMenu->addAction(newAct);

...还有一个基于图标的工具栏:

fileToolBar->addAction(newAct);

菜单栏使用文本说明在与操作对应的菜单中创建条目。同样,工具栏使用QAction上设置的图标在工具栏中创建与操作对应的图标。选择菜单项,单击工具栏图标或按键盘快捷键都会产生相同的效果:由QAction::triggered()newFile()的链接定义。

因此,要直接回答您的问题:QAction是一种抽象方式,用于定义应用程序执行的特定任务的各种参数和行为。 QToolbarButtonQWidget为响应QToolbar

而创建的UI对象(源自QToolbar::addAction()

问题2:

是的,QPushButton有一个clicked() signal继承自QAbstractButton,但它确实缺少一种通知鼠标何时进入其边界的方法。为了实现这一点,您有几个选项,但首先需要先设置要启用的mouseTracking属性。即使没有按下鼠标按钮,这也允许您在QPushButton上接收鼠标移动事件。完成后,您需要探索以下选项之一:

  1. 根据您的建议,您可以继承QPushButton并重新实现mousePressEvent以响应鼠标位置。
  2. 您可以在QPushButton上安装另一个小部件eventFilter,并关注类型为QEvent::MouseMove的事件。