a.medveditskov
Июль 14, 2015 12:50:46
Доброго времени суток, господа питонисты.
Помогите советом чайнику, буду премного благодарен за науку.
И так, на форме есть панелька ToolBar. По нажатию правой кнопки мышки на панели выскакивает Button ну и ToolBar становится невидимой (visibilityChanged(bool)). Да, все так и должно быть, но только в данном случае мне это не требуется. Нет, не так сказал… Требуется исключить появления Button по нажатию правой кнопки и, следовательно, исключить для пользователя возможность закрытия ToolBar'a? Сильно не пинайте за глупый вопрос, у меня уважительные причины…
Спасибо.
py.user.next
Июль 14, 2015 14:34:28
Приведи код.
a.medveditskov
Июль 14, 2015 15:33:44
#Пример - учебный, если пойму как он работает, то все ОК.
#Листинг 726. QAction.py
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys
class MyLabel(QtGui.QLabel):
def __init__(self, txt, parent=None):
QtGui.QLabel.__init__(self, txt, parent)
def event(self, e):
if e.type() == QtCore.QEvent.StatusTip:
self.setText(e.tip())
return True
return QtGui.QLabel.event(self, e)
class MyWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.label = MyLabel(“Содержимое страницы”)
self.button = QtGui.QPushButton(“Сделать доступным/недоступным”)
self.box = QtGui.QVBoxLayout()
self.box.addWidget(self.label)
self.box.addWidget(self.button)
self.setLayout(self.box)
class MyWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.w = MyWidget()
self.setCentralWidget(self.w)
self.w.button.clicked.connect(self.on_clicked)
self.add_menu()
self.add_tool_bar()
self.statusBar().showMessage(“”)
def add_menu(self):
self.menuFile = QtGui.QMenu(“&File”)
self.actOpen = QtGui.QAction(self)
self.actOpen.setText(“&Open”)
self.actOpen.setShortcut(QtGui.QKeySequence.Open)
self.actOpen.setShortcutContext(QtCore.Qt.WindowShortcut)
self.actOpen.setToolTip(“Текст всплывающей подсказки”)
self.actOpen.setWhatsThis(“Текст справки”)
self.actOpen.setStatusTip(“Текст для строки состояния”)
self.actOpen.triggered.connect(self.on_open)
self.actOpen.hovered.connect(self.on_hovered)
self.menuFile.addAction(self.actOpen)
self.actCheckable = QtGui.QAction(“&Checkable”, self)
self.actCheckable.setCheckable(True)
self.actCheckable.setChecked(True)
self.actCheckable.setIconVisibleInMenu(False)
ico = self.style().standardIcon(
QtGui.QStyle.SP_MessageBoxCritical)
self.actCheckable.setIcon(ico)
f = self.actCheckable.font()
f.setBold(True)
self.actCheckable.setFont(f)
self.actCheckable.changed.connect(self.on_changed)
self.actCheckable.toggled.connect(self.on_toggled)
self.menuFile.addAction(self.actCheckable)
self.actSep = QtGui.QAction(self)
self.actSep.setSeparator(True)
self.menuFile.addAction(self.actSep)
self.actExit = QtGui.QAction(“&Exit”, self)
self.actExit.setIcon(ico)
self.actExit.setShortcut(“Ctrl+W”)
self.actExit.triggered.connect(QtGui.qApp.quit)
self.menuFile.addAction(self.actExit)
self.actH = QtGui.QAction(“H&elps”, self)
ico2 = self.style().standardIcon(
QtGui.QStyle.SP_MessageBoxInformation)
self.actH.setIcon(ico2)
self.menuHelp = QtGui.QMenu(“&Help”)
self.actHelp = QtGui.QAction(“Help”, self)
self.actHelp.setShortcut(“F1”)
self.menuHelp.addAction(self.actHelp)
self.actH.setMenu(self.menuHelp)
self.menuFile.addAction(self.actH)
self.actMenuFile = self.menuBar().addMenu(self.menuFile)
def add_tool_bar(self):
self.toolBar = QtGui.QToolBar(“MyToolBar”)
self.toolBar.addAction(self.actCheckable)
self.toolBar.addAction(self.actH)
self.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
def on_open(self):
print(“Выбран пункт меню Open”)
def on_hovered(self):
self.actOpen.showStatusText(self.w.label)
def on_toggled(self, status):
print(“on_toggled”, status)
def on_changed(self):
print(“on_changed”)
def on_clicked(self):
self.actCheckable.setEnabled(not self.actCheckable.isEnabled())
app = QtGui.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(“Класс QAction”)
window.resize(500, 350)
window.show()
sys.exit(app.exec_())
py.user.next
Июль 14, 2015 23:50:38
Используй теги кода, иначе пропадает табуляция.
Rodegast
Июль 15, 2015 10:39:36
self.toolBar.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
a.medveditskov
Июль 15, 2015 13:25:50
Да, это (вероятно) то, что я искал…
Однако, питон “кушает код”, не ругается, но и не реагирует на эту строку?
К чему бы это, вроде уже не понедельник… и еще не пятница?
a.medveditskov
Июль 16, 2015 09:49:07
Попытка номер 2.
Вставляю текст примера.
Нужно сделать так, чтобы по нажатию правой кнопки мыши на ToolBar'е невозможно было бы закрыть панельку? Остальное - см. выше.
<code>
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys
class MyLabel(QtGui.QLabel):
def __init__(self, txt, parent=None):
QtGui.QLabel.__init__(self, txt, parent)
def event(self, e):
if e.type() == QtCore.QEvent.StatusTip:
self.setText(e.tip())
return True
return QtGui.QLabel.event(self, e)
class MyWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.label = MyLabel(“Содержимое страницы”)
self.button = QtGui.QPushButton(“Сделать доступным/недоступным”)
self.box = QtGui.QVBoxLayout()
self.box.addWidget(self.label)
self.box.addWidget(self.button)
self.setLayout(self.box)
class MyWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.w = MyWidget()
self.setCentralWidget(self.w)
self.w.button.clicked.connect(self.on_clicked)
self.add_menu()
self.add_tool_bar()
self.statusBar().showMessage(“”)
def add_menu(self):
self.menuFile = QtGui.QMenu(“&File”)
self.actOpen = QtGui.QAction(self)
self.actOpen.setText(“&Open”)
self.actOpen.setShortcut(QtGui.QKeySequence.Open)
self.actOpen.setShortcutContext(QtCore.Qt.WindowShortcut)
self.actOpen.setToolTip(“Текст всплывающей подсказки”)
self.actOpen.setWhatsThis(“Текст справки”)
self.actOpen.setStatusTip(“Текст для строки состояния”)
self.actOpen.triggered.connect(self.on_open)
self.actOpen.hovered.connect(self.on_hovered)
self.menuFile.addAction(self.actOpen)
self.actCheckable = QtGui.QAction(“&Checkable”, self)
self.actCheckable.setCheckable(True)
self.actCheckable.setChecked(True)
self.actCheckable.setIconVisibleInMenu(False)
ico = self.style().standardIcon(
QtGui.QStyle.SP_MessageBoxCritical)
self.actCheckable.setIcon(ico)
f = self.actCheckable.font()
f.setBold(True)
self.actCheckable.setFont(f)
self.actCheckable.changed.connect(self.on_changed)
self.actCheckable.toggled.connect(self.on_toggled)
self.menuFile.addAction(self.actCheckable)
self.actSep = QtGui.QAction(self)
self.actSep.setSeparator(True)
self.menuFile.addAction(self.actSep)
self.actExit = QtGui.QAction(“&Exit”, self)
self.actExit.setIcon(ico)
self.actExit.setShortcut(“Ctrl+W”)
self.actExit.triggered.connect(QtGui.qApp.quit)
self.menuFile.addAction(self.actExit)
self.actH = QtGui.QAction(“H&elps”, self)
ico2 = self.style().standardIcon(
QtGui.QStyle.SP_MessageBoxInformation)
self.actH.setIcon(ico2)
self.menuHelp = QtGui.QMenu(“&Help”)
self.actHelp = QtGui.QAction(“Help”, self)
self.actHelp.setShortcut(“F1”)
self.menuHelp.addAction(self.actHelp)
self.actH.setMenu(self.menuHelp)
self.menuFile.addAction(self.actH)
self.actMenuFile = self.menuBar().addMenu(self.menuFile)
def add_tool_bar(self):
self.toolBar = QtGui.QToolBar(“MyToolBar”)
##########################################
self.toolBar.setContextMenuPolicy(QtCore.Qt.NoContextMenu) #Не работает
##########################################
self.toolBar.addAction(self.actCheckable)
self.toolBar.addAction(self.actH)
self.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
def on_open(self):
print(“Выбран пункт меню Open”)
def on_hovered(self):
self.actOpen.showStatusText(self.w.label)
def on_toggled(self, status):
print(“on_toggled”, status)
def on_changed(self):
print(“on_changed”)
def on_clicked(self):
self.actCheckable.setEnabled(not self.actCheckable.isEnabled())
app = QtGui.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle(“Класс QAction”)
window.resize(500, 350)
window.show()
sys.exit(app.exec_())
<code/>
a.medveditskov
Июль 16, 2015 09:51:55
Да, что-то пошло не так…
Объявляется перерыв.
py.user.next
Июль 16, 2015 10:12:49
a.medveditskov
<code/>
Вместо угловых скобок квадратные надо.
a.medveditskov
Июль 16, 2015 12:56:29
Спасибо, исправил. Хотя, почему квадратные? Когда везде стоят угловые, ну да ладно…
И так, звучит барабанная дробь… - попытка номер три!
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys
class MyLabel(QtGui.QLabel):
def __init__(self, txt, parent=None):
QtGui.QLabel.__init__(self, txt, parent)
def event(self, e):
if e.type() == QtCore.QEvent.StatusTip:
self.setText(e.tip())
return True
return QtGui.QLabel.event(self, e)
class MyWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.label = MyLabel("Содержимое страницы")
self.button = QtGui.QPushButton("Сделать доступным/недоступным")
self.box = QtGui.QVBoxLayout()
self.box.addWidget(self.label)
self.box.addWidget(self.button)
self.setLayout(self.box)
class MyWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.w = MyWidget()
self.setCentralWidget(self.w)
self.w.button.clicked.connect(self.on_clicked)
self.add_menu()
self.add_tool_bar()
self.statusBar().showMessage("")
def add_menu(self):
self.menuFile = QtGui.QMenu("&File")
self.actOpen = QtGui.QAction(self)
self.actOpen.setText("&Open")
self.actOpen.setShortcut(QtGui.QKeySequence.Open)
self.actOpen.setShortcutContext(QtCore.Qt.WindowShortcut)
self.actOpen.setToolTip("Текст всплывающей подсказки")
self.actOpen.setWhatsThis("Текст справки")
self.actOpen.setStatusTip("Текст для строки состояния")
self.actOpen.triggered.connect(self.on_open)
self.actOpen.hovered.connect(self.on_hovered)
self.menuFile.addAction(self.actOpen)
self.actCheckable = QtGui.QAction("&Checkable", self)
self.actCheckable.setCheckable(True)
self.actCheckable.setChecked(True)
self.actCheckable.setIconVisibleInMenu(False)
ico = self.style().standardIcon(
QtGui.QStyle.SP_MessageBoxCritical)
self.actCheckable.setIcon(ico)
f = self.actCheckable.font()
f.setBold(True)
self.actCheckable.setFont(f)
self.actCheckable.changed.connect(self.on_changed)
self.actCheckable.toggled["bool"].connect(self.on_toggled)
self.menuFile.addAction(self.actCheckable)
self.actSep = QtGui.QAction(self)
self.actSep.setSeparator(True)
self.menuFile.addAction(self.actSep)
self.actExit = QtGui.QAction("&Exit", self)
self.actExit.setIcon(ico)
self.actExit.setShortcut("Ctrl+W")
self.actExit.triggered.connect(QtGui.qApp.quit)
self.menuFile.addAction(self.actExit)
self.actH = QtGui.QAction("H&elps", self)
ico2 = self.style().standardIcon(
QtGui.QStyle.SP_MessageBoxInformation)
self.actH.setIcon(ico2)
self.menuHelp = QtGui.QMenu("&Help")
self.actHelp = QtGui.QAction("Help", self)
self.actHelp.setShortcut("F1")
self.menuHelp.addAction(self.actHelp)
self.actH.setMenu(self.menuHelp)
self.menuFile.addAction(self.actH)
self.actMenuFile = self.menuBar().addMenu(self.menuFile)
def add_tool_bar(self):
self.toolBar = QtGui.QToolBar("MyToolBar")
##########################################
self.toolBar.setContextMenuPolicy(QtCore.Qt.NoContextMenu) #Не работает
##########################################
self.toolBar.addAction(self.actCheckable)
self.toolBar.addAction(self.actH)
self.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
def on_open(self):
print("Выбран пункт меню Open")
def on_hovered(self):
self.actOpen.showStatusText(self.w.label)
def on_toggled(self, status):
print("on_toggled", status)
def on_changed(self):
print("on_changed")
def on_clicked(self):
self.actCheckable.setEnabled(not self.actCheckable.isEnabled())
app = QtGui.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle("Класс QAction")
window.resize(500, 350)
window.show()
sys.exit(app.exec_())
[code/]
О-о-о-п-а! Сработало. Правда не так красиво, как у других. Ну да ладно, пока пусть так.
Спасибо за умные наставления.