1个QPushButton控制来自2个不同类的2个动作

时间:2013-05-18 04:58:06

标签: python qt pyside qpushbutton

这是一个pyside GUI,我在2个不同的.py文件中创建了2个面板,main.py和sub.py每个面板都会显示我们的浏览器'QWebView'。目前,当用户按下main.py上的按钮时,它会将用户重定向到例如“www.google”的页面,用户必须单击sub.py上的按钮才能重定向到例如“www.facebook.com”他们工作作为一种独立的功能。

我想问一下,如果用户按下main.py上的按钮,并且两个webbrower将一起更改,有没有办法将两者链接在一起?

1 个答案:

答案 0 :(得分:1)

是的,您可以使用同一连接触发多个项目。

QObject::connect(myButton, SIGNAL(clicked()), 
                     this,  SLOT(launchGoogleSiteOnBrowserA());
QObject::connect(myButton, SIGNAL(clicked()), 
                     pointerToOtherClass, SLOT(launchFacebookSiteOnBrowserB());

http://qt-project.org/doc/qt-4.8/signalsandslots.html

编辑:关于在PyQt中使用信号和插槽的另一个答案......

https://stackoverflow.com/a/7618282/999943

以下是在PyQt中执行此操作的方法:

widget.pyw

from PyQt4 import QtCore, QtGui
from mybrowser import Browser

class Widget(QtGui.QWidget):
    def __init__(self):
        super(Widget, self).__init__()
        self.myButton = QtGui.QPushButton('Open Facebook and Google')
        self.myHLayout = QtGui.QHBoxLayout()

        self.myVLayout = QtGui.QVBoxLayout()
        self.myVLayout.addWidget(self.myButton)

        url = QtCore.QUrl('http://www.yahoo.com')
        self.browserLHS = Browser(url)
        self.browserRHS = Browser(url)

        self.myHLayout.addWidget(self.browserLHS)
        self.myHLayout.addWidget(self.browserRHS)

        QtCore.QObject.connect(self.myButton, QtCore.SIGNAL("clicked()"), self.changePageOnBothBrowsers )

        self.myVLayout.addLayout(self.myHLayout)

        self.setLayout(self.myVLayout)

    def changePageOnBothBrowsers(self):
        self.browserLHS.load(QtCore.QUrl.fromUserInput('google.com'))
        self.browserRHS.load(QtCore.QUrl.fromUserInput('facebook.com'))

if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)

    widget = Widget()
    widget.show()

    sys.exit(app.exec_())

mybrowser.pyw

from PyQt4 import QtCore, QtGui, QtNetwork, QtWebKit

import jquery_rc

class Browser(QtWebKit.QWebView):
    def __init__(self, url):
        super(Browser, self).__init__()

        self.progress = 0

        fd = QtCore.QFile(":/jquery.min.js")

        if fd.open(QtCore.QIODevice.ReadOnly | QtCore.QFile.Text):
            self.jQuery = QtCore.QTextStream(fd).readAll()
            fd.close()
        else:
            self.jQuery = ''

        QtNetwork.QNetworkProxyFactory.setUseSystemConfiguration(True)


        self.load(url)
        self.loadFinished.connect(self.adjustLocation)
        self.titleChanged.connect(self.adjustTitle)
        self.loadProgress.connect(self.setProgress)
        self.loadFinished.connect(self.finishLoading)

        self.locationEdit = QtGui.QLineEdit(self)
        self.locationEdit.setSizePolicy(QtGui.QSizePolicy.Expanding,
                self.locationEdit.sizePolicy().verticalPolicy())
        self.locationEdit.returnPressed.connect(self.changeLocation)

    def adjustLocation(self):
        self.locationEdit.setText(self.url().toString())

    def changeLocation(self):
        url = QtCore.QUrl.fromUserInput(self.locationEdit.text())
        self.load(url)
        self.setFocus()

    def adjustTitle(self):
        if 0 < self.progress < 100:
            self.setWindowTitle("%s (%s%%)" % (self.title(), self.progress))
        else:
            self.setWindowTitle(self.title())

    def setProgress(self, p):
        self.progress = p
        self.adjustTitle()

    def finishLoading(self):
        self.progress = 100
        self.adjustTitle()
        self.page().mainFrame().evaluateJavaScript(self.jQuery)

#if __name__ == '__main__':
#
#    import sys
#
#    app = QtGui.QApplication(sys.argv)
#
#    if len(sys.argv) > 1:
#        url = QtCore.QUrl(sys.argv[1])
#    else:
#        url = QtCore.QUrl('http://www.google.com/ncr')
#
#    browser = Browser(url)
#    browser.show()
#
#    sys.exit(app.exec_())

希望有所帮助。