繁体   English   中英

pyqt5 组合框选定的项目与另一个窗口共享(信号/插槽)

[英]pyqt5 combobox selected item share with another window (signal/slot)

我正在尝试将 Qcombobox 选定的变量数据从 onewindow.py 获取到 anotherWindow.py。 当我使用信号/插槽机制时,我被卡住了。

我有两个文件mainWindow.pyconnection.py ,在 mainWindow 我有一个组合框,用户可以在其中选择一个服务器,我想要,当用户从组合框中选择一个服务器时,然后选定的项目(变量)将被发送到 connection.py

主窗口.py:

from PyQt5 import QtCore, QtGui, QtWidgets


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.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(310, 230, 151, 22))
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(310, 300, 281, 20))
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        # combobox selected
        self.comboBox.activated[str].connect(self.onChanged)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.comboBox.setItemText(0, _translate("MainWindow", "TFUS3"))
        self.comboBox.setItemText(1, _translate("MainWindow", "TFUSD"))
        self.label.setText(_translate("MainWindow", "TextLabel"))

    #-----------
    def onChanged(self,text):
        self.label.setText(text)
        message=text
        return message

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

连接.py

 from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel
    from PyQt5.QtWidgets import QTableView, QApplication
    import mainWindow
    from mainWindow import *

    class Example(QWidget):

        def get_value(self,text):
        message=text
        print(message)

        def __init__(self):
            super().__init__()

            self.initUI()

        def initUI(self):      

            self.lbl = QLabel("select server from mainwindow is:",self )

            self.setGeometry(300, 300, 300, 200)
            self.setWindowTitle('QComboBox')
            self.show()


        def onActivated(self, text):


            createConnection(self,text)
            self.lbl.adjustSize()  


    ------server part----------------------------
    USERNAME = 'XXXXXX'
    PASSWORD = '000000'

    def selectedServer(server):
        switcher ={
            'Server1': 'x.x.x.x,1433',
            'Server2': 'x.x.x.x,1433',
        }
        return switcher.get(server,"Invalid Server ")

    def createConnection(self,server):


        SERVER= selectedServer(server)

        global db
        db = QSqlDatabase.addDatabase('QODBC')
        db.setDatabaseName(f'Driver={{SQL SERVER}}; Server={SERVER}; UID={USERNAME}; PWD={PASSWORD}')
        if db.open():
            self.lbl.setText(f'{server} Server connected successfully')
            print(f'{server} Server connected successfully')

        else:
            print('connection failed')


    if __name__ == '__main__':

        app = QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec_())

我尝试了很多次在连接窗口的文本标签中显示选定的服务器。但失败了。 不知道我哪里做错了。

首先必须清楚,信息不是在文件之间发送而是在对象之间发送,应用程序不是文件,而是源代码(文件)中描述的对象或其他元素之间的交互。

另一方面,您不应修改 Qt Designer 生成的代码,因此您必须恢复 mainWindow.py 文件。

考虑到上述情况,必须创建每个类的实例(在 Ui_MainWindow 的情况下,最好创建一个继承自适当小部件的新类并使用 Ui_MainWindow 来填充它)。 然后在组件之间建立连接。

连接.py

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, QtSql


USERNAME = "XXXXXX"
PASSWORD = "000000"


def selectedServer(server):
    switcher = {
        "Server1": "x.x.x.x,1433",
        "Server2": "x.x.x.x,1433",
    }
    return switcher.get(server, "Invalid Server ")


class Example(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.lbl = QtWidgets.QLabel("select server from mainwindow is:", self)

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle("QComboBox")

    def setServer(self, name):
        self.createConnection(name)
        self.lbl.adjustSize()

    def createConnection(self, server):
        SERVER = selectedServer(server)
        db = QtSql.QSqlDatabase.addDatabase("QODBC")
        db.setDatabaseName(
            f"Driver={{SQL SERVER}}; Server={SERVER}; UID={USERNAME}; PWD={PASSWORD}"
        )
        if db.open():
            self.lbl.setText(f"{server} Server connected successfully")
            self.lbl.adjustSize()
            print(f"{server} Server connected successfully")

        else:
            print("connection failed")


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())

主文件

import sys

from PyQt5 import QtWidgets

from mainWindow import ui_MainWindow
from connection import Example


class MainWindow(QtWidgets.QMainWindow, ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    ex = Example()
    ex.show()

    w.comboBox.currentTextChanged.connect(ex.setServer)
    sys.exit(app.exec_())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM