[英]Is there any way to show help tab in pyqt5?
我正在 pyqt5 中為我的拼貼項目編寫代碼,我需要在其中制作一個幫助選項卡。 我計划在內容方面提供幫助,因為大多數軟件都如下圖所示(onlyoffice 的幫助)。 有什么方法可以輕松寫出來嗎?
這種在標題欄中顯示多個“選項卡”的界面的問題在於,使用 Qt 不容易實現,您應該手動實現整個標題欄,這並不容易。
如果您正在尋找更簡單的解決方案,我建議您使用 QTabWidget,如果只有一個選項卡,則不顯示選項卡欄。 如果您還沒有使用帶有可關閉選項卡的選項卡式界面,您可以將選項卡小部件設置為允許可關閉選項卡並覆蓋默認方法,以便在不需要時隱藏關閉按鈕。
class TabWidget(QtWidgets.QTabWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setDocumentMode(True)
self.setTabsClosable(True)
self.tabCloseRequested.connect(self.removeTab)
self.tabBar().hide()
def addTab(self, *args, **kwargs):
self.insertTab(-1, *args, **kwargs)
def insertTab(self, *args, **kwargs):
super().insertTab(*args)
closable = kwargs.get('closable', False)
if not closable:
index = args[0]
if index < 0:
index = self.count() - 1
for side in QtWidgets.QTabBar.LeftSide, QtWidgets.QTabBar.RightSide:
widget = self.tabBar().tabButton(index, side)
if isinstance(widget, QtWidgets.QAbstractButton):
self.tabBar().setTabButton(index, side, None)
break
self.tabBar().setVisible(self.count() > 1)
def removeTab(self, index):
super().removeTab(index)
self.tabBar().setVisible(self.count() > 1)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.tabWidget = TabWidget()
self.setCentralWidget(self.tabWidget)
self.main = QtWidgets.QWidget()
self.tabWidget.addTab(self.main, 'My program')
layout = QtWidgets.QGridLayout(self.main)
someButton = QtWidgets.QPushButton('Some button')
layout.addWidget(someButton, 0, 0)
layout.addWidget(QtWidgets.QLabel('Some label'), 0, 1)
helpButton = QtWidgets.QPushButton('Show help!')
layout.addWidget(helpButton, 0, 2)
textEdit = QtWidgets.QTextEdit()
layout.addWidget(textEdit, 1, 0, 1, 3)
self.helpTab = QtWidgets.QTextBrowser()
self.helpTab.setHtml('Hello, this is <b>help</b>!')
helpButton.clicked.connect(self.showHelp)
def showHelp(self):
for i in range(self.tabWidget.count()):
if self.tabWidget.widget(i) == self.helpTab:
break
else:
self.tabWidget.addTab(self.helpTab, 'Help!', closable=True)
self.tabWidget.setCurrentWidget(self.helpTab)
self.tabWidget.tabBar().show()
現在,由於您還需要一些基於上下文的幫助,您可以通過whatsThis()
功能進行破解。 當窗口處於“這是什么模式”並且用戶單擊小部件時,“這是什么”功能允許在覆蓋的小窗口中顯示一些基於上下文的幫助。 我們可以使用事件過濾器來檢測用戶何時單擊小部件並使用whatsThis()
屬性作為顯示相關幫助的上下文。
在下面的示例中,我使用了一個填充 QTextBrowser 的簡單字典,但您顯然可以使用對本地文檔文件甚至Qt 幫助框架的訪問。
請注意,為了使用這種方法,我必須在所有子小部件上安裝一個事件過濾器,這是因為如果小部件實際上具有whatsThis()
屬性集,Qt 能夠對“這是什么”事件做出反應。 訣竅是在窗口進入what's this 模式時為所有子小部件設置一個whatsThis
屬性,並在每個小部件上安裝一個專門的事件過濾器,然后在剩下這個模式時立即卸載事件過濾器。
NoWhatsThisText = '__NoWhatsThis'
NoWhatsThisValue = 'There is no help for this object'
HelpData = {
NoWhatsThisText: NoWhatsThisValue,
'someButton': 'Do something with the button',
'helpButton': 'Click the button to show this help',
'textEdit': 'Type <b>some text</b> to <i>read</i> it',
'mainWindow': 'A main window is cool!',
}
class WhatsThisWatcher(QtCore.QObject):
whatsThis = QtCore.pyqtSignal(str)
def eventFilter(self, source, event):
if event.type() == QtCore.QEvent.WhatsThis:
whatsThis = source.whatsThis()
while whatsThis == NoWhatsThisText:
if not source.parent():
break
source = source.parent()
whatsThis = source.whatsThis()
self.whatsThis.emit(whatsThis)
event.accept()
return True
return super().eventFilter(source, event)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
# ...
whatsThisAction = self.menuBar().addAction('What\'s this?')
whatsThisAction.triggered.connect(
QtWidgets.QWhatsThis.enterWhatsThisMode)
self.watchedWhatsThis = []
self.whatsThisWatcher = WhatsThisWatcher()
self.whatsThisWatcher.whatsThis.connect(self.showHelp)
self.installEventFilter(self.whatsThisWatcher)
someButton.setWhatsThis('someButton')
helpButton.setWhatsThis('helpButton')
textEdit.setWhatsThis('textEdit')
self.setWhatsThis('mainWindow')
def showHelp(self, context=''):
# ...
if context:
self.helpTab.setHtml(HelpData.get(context, NoWhatsThisValue))
if QtWidgets.QWhatsThis.inWhatsThisMode():
QtWidgets.QWhatsThis.leaveWhatsThisMode()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.