PyQt5 Python在单击现有菜单选项时生成新按钮

PyQt5 Python在单击现有菜单选项时生成新按钮,python,pyqt5,Python,Pyqt5,这是我第一次在网站上发帖。对于我来说,学习Python和PyQt5还为时过早,所以我可能缺少一些基本的东西。我正在做一个程序,将有一些基本的功能,但现在我只想让按钮产卵工作 以下是我目前掌握的代码: from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QFileDialog, QPushButton from PyQt5.QtGui import QIcon from PyQt5.QtCore import

这是我第一次在网站上发帖。对于我来说,学习Python和PyQt5还为时过早,所以我可能缺少一些基本的东西。我正在做一个程序,将有一些基本的功能,但现在我只想让按钮产卵工作

以下是我目前掌握的代码:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog, QPushButton
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot
import sys
import os

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(808, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.alltabswidget = QtWidgets.QTabWidget(self.centralwidget)
        self.alltabswidget.setMinimumSize(QtCore.QSize(790, 541))
        self.alltabswidget.setMaximumSize(QtCore.QSize(791, 561))
        self.alltabswidget.setObjectName("alltabswidget")
        self.gaming = QtWidgets.QWidget()
        self.gaming.setObjectName("gaming")
        self.label = QtWidgets.QLabel(self.gaming)
        self.label.setGeometry(QtCore.QRect(6, 2, 781, 511))
        self.label.setText("")
        self.label.setPixmap(QtGui.QPixmap("../../../../../Pictures/Coding Images/Coding.jpg"))
        self.label.setScaledContents(True)
        self.label.setObjectName("label")
        self.firstcodingbutton = QtWidgets.QPushButton(self.gaming)
        self.firstcodingbutton.setGeometry(QtCore.QRect(50, 30, 141, 51))
        self.firstcodingbutton.setObjectName("firstcodingbutton")
        self.alltabswidget.addTab(self.gaming, "")
        self.gaming1 = QtWidgets.QWidget()
        self.gaming1.setObjectName("gaming1")
        self.label_2 = QtWidgets.QLabel(self.gaming1)
        self.label_2.setGeometry(QtCore.QRect(6, 2, 781, 511))
        self.label_2.setText("")
        self.label_2.setPixmap(QtGui.QPixmap("../../../../../Pictures/Coding Images/Gaming.jpg"))
        self.label_2.setScaledContents(True)
        self.label_2.setObjectName("label_2")
        self.firstgamingbutton = QtWidgets.QPushButton(self.gaming1)
        self.firstgamingbutton.setGeometry(QtCore.QRect(50, 30, 141, 51))
        self.firstgamingbutton.setObjectName("firstgamingbutton")
        self.alltabswidget.addTab(self.gaming1, "")
        self.fileaccess = QtWidgets.QWidget()
        self.fileaccess.setObjectName("fileaccess")
        self.label_3 = QtWidgets.QLabel(self.fileaccess)
        self.label_3.setGeometry(QtCore.QRect(6, 2, 781, 511))
        self.label_3.setText("")
        self.label_3.setPixmap(QtGui.QPixmap("../../../../../Pictures/Coding Images/Other.jpg"))
        self.label_3.setScaledContents(True)
        self.label_3.setObjectName("label_3")
        self.firstfileacessbutton = QtWidgets.QPushButton(self.fileaccess)
        self.firstfileacessbutton.setGeometry(QtCore.QRect(50, 30, 141, 51))
        self.firstfileacessbutton.setObjectName("firstfileacessbutton")
        self.alltabswidget.addTab(self.fileaccess, "")
        self.gridLayout.addWidget(self.alltabswidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 808, 21))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionnewshortcut = QtWidgets.QAction(MainWindow)
        self.actionnewshortcut.setObjectName("actionnewshortcut")
##        self.actionnewshortcut.triggered.connect(clicknewshortcut)
        self.actionsave = QtWidgets.QAction(MainWindow)
        self.actionsave.setObjectName("actionsave")
        self.actionexit = QtWidgets.QAction(MainWindow)
        self.actionexit.setObjectName("actionexit")
        self.menuFile.addAction(self.actionnewshortcut)
        self.menuFile.addAction(self.actionsave)
        self.menuFile.addAction(self.actionexit)
        self.menubar.addAction(self.menuFile.menuAction())

        self.retranslateUi(MainWindow)
        self.alltabswidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Shortcuts"))
        self.firstcodingbutton.setText(_translate("MainWindow", "Rename Me"))
        self.alltabswidget.setTabText(self.alltabswidget.indexOf(self.gaming), _translate("MainWindow", "Coding"))
        self.firstgamingbutton.setText(_translate("MainWindow", "Rename Me"))
        self.alltabswidget.setTabText(self.alltabswidget.indexOf(self.gaming1), _translate("MainWindow", "Gaming"))
        self.firstfileacessbutton.setText(_translate("MainWindow", "Rename Me"))
        self.alltabswidget.setTabText(self.alltabswidget.indexOf(self.fileaccess), _translate("MainWindow", "File Access"))
        self.menuFile.setTitle(_translate("MainWindow", "File"))
        self.actionnewshortcut.setText(_translate("MainWindow", "New Shortcut"))
        self.actionnewshortcut.setShortcut(_translate("MainWindow", "Ctrl+N"))
        self.actionsave.setText(_translate("MainWindow", "Save"))
        self.actionsave.setShortcut(_translate("MainWindow", "Ctrl+S"))
        self.actionexit.setText(_translate("MainWindow", "Exit"))
        self.actionexit.setShortcut(_translate("MainWindow", "Ctrl+E"))

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_())

我确实在网站上找到了,但是在那个例子中,主窗口的设置有点不同,我不知道如何将按钮生成函数插入到我的代码中。基本上我想让它这样,当你去文件,然后新的快捷方式,它会生成一个按钮,就在下面的第一个在当前选定的选项卡。我可以在之后搞乱几何学,但首先我要让这一代人开始工作。我已经注释掉了触发信号,因为它还没有链接到任何东西。

self
添加到插槽中

self.actionnewshortcut.triggered.connect(self.clicknewshortcut)
在类中定义方法

def clicknewshortcut(self):
    tab = self.alltabswidget.currentWidget()
    first_btn = tab.findChild(QPushButton)
    btn = QPushButton('New Button', tab)
    btn.setGeometry(first_btn.geometry().translated(0, first_btn.height()))
    btn.show()

它获取当前窗口小部件,创建一个新按钮,并将其几何图形设置在该窗口小部件中的第一个按钮下方。

窗口的设置不同,您遇到了困难,因为您试图修改pyuic生成的文件,这是不应该做的事情。要正确使用这些文件(您现在应该再次生成),请遵循有关的官方指导原则。我不确定您在这篇评论中的意思。我知道你应该在PUIC5中完成你的ui设计,而且(我相信)在将它转换成.py文件之前,我已经在那里做了尽可能多的工作。到目前为止,我在帖子中所写和分享的内容都能正常工作(访问3个选项卡背景的图像文件)。我没有试图编辑这些文件的内容,我只是试图在单击“文件”菜单中的某个选项时生成按钮。我让其他人用一个函数来响应,希望它能解决问题,我会在测试后更新。我不是说它不工作,而是说你不应该这样做。决不能修改pyuic生成的文件;其中一个最重要的原因是,在某个时候,您可能需要修改UI,然后使用pyuic再次生成py文件,这使得您很难与目前编写的现有代码集成。这些文件应该导入到另一个“主”脚本中,该脚本将包含程序的“逻辑”。这样,您最终将能够轻松地修改UI,剩下的唯一事情就是再次生成文件。但由于我是新来的,我不知道如何将逻辑与PyQT设计器输出的.py文件分开来构造,我将不得不进行更多的阅读。