QPushButton.setMenu (self, QMenu menu) 使用从 Qt Designer 生成的代码
Posted
技术标签:
【中文标题】QPushButton.setMenu (self, QMenu menu) 使用从 Qt Designer 生成的代码【英文标题】:QPushButton.setMenu (self, QMenu menu) using code generated from Qt Designer 【发布时间】:2019-02-27 17:45:27 【问题描述】:我正在尝试使用 Qt5 Designer 工具创建一个弹出按钮。我在 qt 设计器中设计了 gui,然后使用 pyuic5 将其转换为 .py 文件。但我似乎无法将使用 qt 设计器通过拖放添加的默认按钮更改为流行风格的按钮,单击该按钮会给我提供条形图、散点图、箱形图等选项。我想要做的是创建一个弹出按钮,它将提供选项 Bar、Scatter、Box 并且当我选择受尊重的选项时,标签会更改为加载的图像。代码如下:
# Form implementation generated from reading ui file 'adcombo.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon, QPixmap
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(6, 10, 791, 361))
self.label.setFrameShape(QtWidgets.QFrame.WinPanel)
self.label.setText("")
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(120, 430, 231, 91))
self.pushButton.setStyleSheet("color: rgb(255, 0, 0);\n"
"background-color: rgb(79, 79, 79);\n"
"font: 75 16pt \"MS Shell Dlg 2\";")
self.pushButton.setObjectName("pushButton")
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(410, 430, 301, 91))
self.comboBox.setStyleSheet("color: rgb(255, 0, 0);\n"
"background-color: rgb(79, 79, 79);\n"
"font: 75 16pt \"MS Shell Dlg 2\";")
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.setItemText(0, "")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.comboBox.setVisible(False)
self.comboBox.currentTextChanged.connect(self.on_combobox_changed)
self.pushButton.clicked.connect(self.onclick)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Chart Type"))
self.comboBox.setItemText(1, _translate("MainWindow", "Bar"))
self.comboBox.setItemText(2, _translate("MainWindow", "Scatter"))
self.comboBox.setItemText(3, _translate("MainWindow", "Box"))
def onclick(self) :
self.comboBox.setVisible(True)
def on_combobox_changed(self) :
if self.comboBox.currentText()=='Bar' :
bar = QPixmap('bar.png')
self.label.setPixmap(bar)
if self.comboBox.currentText()=='Scatter' :
scatter= QPixmap('scatter.png')
self.label.setPixmap(scatter)
if self.comboBox.currentText()=='Box' :
box = QPixmap('box.png')
self.label.setPixmap(box)
#self.label.setText('Line Chart')
if self.comboBox.currentText()=='' :
self.label.clear()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
我们将不胜感激。
谢谢
更新 1 我想编辑上面的代码,得到一个如下图所示的按钮。
【问题讨论】:
我不明白你的意思,你可以更好地解释我,也许用一个图像你得到什么,另一个你想得到什么。另外你在哪一部分使用 setMenu()? 好吧,我没有在任何地方使用 setMenu(),因为我不知道如何使用它,这就是我需要帮助的地方。我用我需要什么样的按钮的图像更新了帖子 【参考方案1】:你必须创建一个 QMenu,设置 QActions 并使用触发信号来知道 QAction 被按下了。
# Form implementation generated from reading ui file 'adcombo.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon, QPixmap
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(6, 10, 791, 361))
self.label.setFrameShape(QtWidgets.QFrame.WinPanel)
self.label.setText("")
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(120, 430, 231, 91))
self.pushButton.setStyleSheet("color: rgb(255, 0, 0);\n"
"background-color: rgb(79, 79, 79);\n"
"font: 75 16pt \"MS Shell Dlg 2\";")
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Chart Type"))
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.create_menu()
def create_menu(self):
menu = QtWidgets.QMenu(
self.pushButton,
triggered=self.on_menu_triggered
)
for text in ("", "Bar", "Scatter", "Box"):
menu.addAction(text)
self.pushButton.setMenu(menu)
@QtCore.pyqtSlot(QtWidgets.QAction)
def on_menu_triggered(self, action):
pixmap = QtGui.QPixmap()
if not action.text():
self.label.clear()
return
if action.text() == 'Bar':
pixmap = QPixmap('bar.png')
elif action.text() == 'Scatter':
pixmap= QPixmap('scatter.png')
elif action.text() == 'Box':
pixmap = QPixmap('box.png')
self.label.setPixmap(pixmap)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
【讨论】:
非常感谢。赞成答案。完美运行。最后一件事,有什么好的网站可以了解 pyqt gui 开发并变得更好?我正在学习 pyqt5,但是没有完整的指南可供我学习。我仍然不明白你添加的代码的任何部分:(以上是关于QPushButton.setMenu (self, QMenu menu) 使用从 Qt Designer 生成的代码的主要内容,如果未能解决你的问题,请参考以下文章