QDialog:如何使用问号(?)按钮?

9
默认情况下,QDialog窗口在右上角有一个问号按钮。当我按下它时,鼠标指针会变为“禁止”指针,似乎没有其他反应。
尽管有很多人想要删除这个问号(至少有三个SO线程专门讨论了这个问题:at least three),但是 QDialog 的文档并没有关于如何实际使用它的任何信息。
我如何让我的应用程序在单击问号时显示信息?例如,我如何从按钮获取clicked信号?更好的是,这个按钮在哪里有文档记录?
3个回答

12

对我来说,其他答案有些误导性,只关注捕获问号事件,而没有解释正常用法。

当单击此按钮并触发WhatsThisMode时,对话框的元素应该提供关于它们自己的信息。如果鼠标悬停在支持此信息的元素上,则指针将变为带有问号的指向箭头(至少在Windows上),并显示鼠标单击时的工具提示消息。

以下是如何在PySide中实现它:

someWidget.setWhatsThis("Help on widget")

还可以获取关于PySideQt5的QWhatsThis文档。


太好了,你说得对,上面的答案关注于一种特殊用法,感谢指出标准用法和文档! - eric
我在Qt Designer中看到了这个属性,所以你可以从那里进行管理。 - Chris P

3
这不是Qt文档中记录的按钮。你可以通过捕获事件并检查事件类型来检测它:http://qt-project.org/doc/qt-5/qevent.html#Type-enum。有不同的类型,如QEvent::EnterWhatsThisModeQEvent::WhatsThisClicked等。我使用主窗口中的事件过滤器实现了类似于你所寻找的内容。
if(event->type() == QEvent::EnterWhatsThisMode)
    qDebug() << "click";

当我点击问号按钮时,看到了“click”字样。

@Chrnobyl 很酷...现在我需要想办法阻止它显示“禁止”鼠标指针形状--这使得按钮看起来像是误按了(我认为这是相当奇怪的默认行为)。 - eric
@neuronet “禁止”鼠标指针应该出现在每个不支持“whatsThis”的小部件上,所以这是正常的,或者我误解了你的意思? - Jablonski
即使我重新实现了事件,禁止光标仍然被锁定。即使在事件处理程序中添加了QtGui.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)),也是类似的情况:光标暂时显示为箭头,但当光标离开标题栏时,禁止光标又会回来。我计划将此作为一个单独的问题来询问... - eric
在这里询问:http://stackoverflow.com/questions/26977603/qdialog-forbidden-cursor-with-question-mark-press - eric

1

基于Chernobyl的答案,以下是我在Python(PySide)中的实现:

def event(self, event): 
    if event.type() == QtCore.QEvent.EnterWhatsThisMode:
        print "click"
        return True
    return QtGui.QDialog.event(self, event)

也就是说,当应用程序进入“WhatsThisMode”时,您需要重新实现event。否则,将控制权传回给基类。

它几乎可以工作。唯一的问题是鼠标光标仍然变成了“Forbidden”形状。根据另一篇文章的建议,我通过添加以下内容解决了这个问题:

QtGui.QWhatsThis.leaveWhatsThisMode()

在先前的打印命令之前一行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接