Контекстное меню появляется вне интерфейса окна
При нажатии ПКМ по QLineEdit должно высвечиваться контекстное меню на месте клика, но оно появляется вне проекта.
Как исправить?
При необходимости могу скинуть полностью код.
UPDATE
from imports import *
class Ui_MainWindow(QtWidgets.QMainWindow):
def __init__(self,MainWindow):
super().__init__()
MainWindow.setObjectName("MainWindow")
MainWindow.resize(260, 285)
self.centralWidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralWidget)
self.centralWidget.setObjectName("centralwidget")
self.TxtPatchFileLine = QtWidgets.QLineEdit(self.centralWidget)
self.TxtPatchFileLine.setGeometry(QtCore.QRect(100, 10, 150, 20))
self.TxtPatchFileLine.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.TxtPatchFileLine.customContextMenuRequested.connect(self.show_context_menu)
self.TxtPatchFileLine.setObjectName("TxtPatchFileLine")
MainWindow.setCentralWidget(self.centralWidget)
def show_context_menu(self, point):
menu = QMenu()
action = menu.addAction("Hello!")
menu.addAction(action)
action.triggered.connect(self.triggered_action)
menu.exec_(self.mapToGlobal(point))
def triggered_action(self, q):
print(self.sender().text())
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow(MainWindow)
ui.__init__(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Ответы (1 шт):
Как создать минимальный, самодостаточный и воспроизводимый пример
Задавая вопрос о проблеме, источник которой вы видите в своем коде, можно рассчитывать на получение гораздо более качественных ответов, если привести код, с помощью которого участники смогут воспроизвести проблему. Такой пример кода должен быть:
- минимальным — максимально сократите код, сохранив все проблемные моменты;
- самодостаточным — приведите все части кода, необходимые для воспроизведения проблемы;
- воспроизводимым — проверьте, что используя приведенный пример кода, другие участники смогут воспроизвести проблему.
... и дальше по тексту.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.centralWidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralWidget)
self.lineEdit = QLineEdit(self.centralWidget)
self.lineEdit.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.lineEdit.customContextMenuRequested.connect(self.show_context_menu)
self.layout = QtWidgets.QVBoxLayout(self.centralWidget)
self.layout.addWidget(self.lineEdit)
self.layout.addStretch(1)
'''
self.TxtPatchFileLine = QtWidgets.QMenu(self)
action = self.TxtPatchFileLine.addAction('Обзор:')
action.triggered.connect(lambda: QtWidgets.QMessageBox.information(self, 'Info', 'Hello!'))
'''
def show_context_menu(self, point):
menu = QMenu()
action = menu.addAction("Hello!")
menu.addAction(action)
action.setIcon(QIcon("D:/_Qt/img/qt-logo.png"))
action.triggered.connect(self.triggered_action)
menu.exec_(self.mapToGlobal(point))
#- self.TxtPatchFileLine.exec(self.mapToGlobal(point))
def triggered_action(self, q):
print(self.sender().text())
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.resize(400, 300)
w.show()
sys.exit(app.exec())
Update
Все равно не помогло. все также появляется вне проекта.
В вашем примере
строка 29 => action = menu.addAction("Hello!")появляется конкретно на месте клика но у меня оно появляется где-то в верхней правой части экрана При необходимости могу добавить весь код.обновил код в вопросе оставив то что нужно для лучшего понимания
Я добавил обновление в свой ответ, проверьте.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setObjectName("MainWindow") # !!! self
self.centralWidget = QtWidgets.QWidget()
self.setCentralWidget(self.centralWidget)
self.centralWidget.setObjectName("centralwidget")
self.setCentralWidget(self.centralWidget) # !!! self
# --------> v v
self.txtPatchFileLine = QtWidgets.QLineEdit(self.centralWidget) # txtPatchFileLine
self.txtPatchFileLine.setGeometry(QtCore.QRect(100, 10, 150, 20))
self.txtPatchFileLine.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.txtPatchFileLine.customContextMenuRequested.connect(self.show_context_menu)
self.txtPatchFileLine.setObjectName("txtPatchFileLine")
def show_context_menu(self, point):
menu = QMenu()
action = menu.addAction("Hello!")
menu.addAction(action)
action.triggered.connect(self.triggered_action)
menu.exec_(self.mapToGlobal(point))
def triggered_action(self, q):
print(self.sender().text())
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
''' так делать не надо
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow(MainWindow)
ui.__init__(MainWindow)
MainWindow.show()
'''
w = MainWindow()
w.resize(260, 285)
w.show()
sys.exit(app.exec_())

