新手求教,pyqt父子窗口传值

csdnbuku 2015-05-26 08:55:53
问题一:主窗口弹出子窗口,子窗口传值到主窗口。
网上没有找到相关的demo,都是一些简单的信号槽使用。
思路应该是子窗口emit信号,主窗口槽函数接受信号。
瞎折腾了下,以下是代码:有问题,不知道怎么改,求大神解决
问题二:主窗口使用了样式表,弹出子窗口,为什么子窗口不跟着生效?在Qt中只要主窗口用了样式表,由主窗口弹出的子窗口也是跟着生效的。而在pyqt中却不是这样,有点疑问。



#主窗口
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys

from PyQt4 import QtCore, QtGui
from fawen import W2

style = """
.QPushButton{
border-style:none;
border:1px solid #C2CCD8;
color:#F0F0F0;
padding:5px;
min-height:20px;
border-radius:5px;
background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #4D4D4D,stop:1 #292929);
}
"""


class MyForm(QtGui.QDialog):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)




self.lineEdit = QtGui.QLineEdit()
self.button = QtGui.QPushButton(u'子窗口',self)
layout = QtGui.QVBoxLayout()
layout.addWidget(self.lineEdit)
layout.addWidget(self.button)
self.setLayout(layout)
self.setWindowTitle(u'父窗口')

self.button.clicked.connect(self.child)
self.setStyleSheet(style)

def child(self):
print u'弹出子窗口'
self.w2 = W2()
self.connect(self.w2, QtCore.SIGNAL("myclicked()"), self.recv)
self.w2.show()


@QtCore.pyqtSlot(str)
def recv(self,s):
print u'接受到子窗口值'
print s






if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = MyForm()
myapp.show()
sys.exit(app.exec_())




#子窗口fawen.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtCore, QtGui






class W2(QtGui.QDialog):

myclicked = QtCore.pyqtSignal(str)
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)


self.lineEdit = QtGui.QLineEdit()
self.button = QtGui.QPushButton(u'发文',self)
layout = QtGui.QVBoxLayout()
layout.addWidget(self.lineEdit)
layout.addWidget(self.button)
self.setLayout(layout)
self.setWindowTitle(u'子窗口')


self.button.clicked.connect(self.infosend)


def infosend(self):
str = self.lineEdit.text()
self.myclicked.emit(str)

print str







if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = W2()
myapp.show()
sys.exit(app.exec_())

...全文
862 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_36542066 2016-10-28
  • 打赏
  • 举报
回复
引用 5 楼 qcs555shen 的回复:
请问你是怎么解决的,能共享代码吗?
参见楼上
baidu_36542066 2016-10-28
  • 打赏
  • 举报
回复
import sys from PyQt4 import QtCore, QtGui style = """ .QPushButton{ border-style:none; border:1px solid #C2CCD8; color:#F0F0F0; padding:5px; min-height:20px; border-radius:5px; background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #4D4D4D,stop:1 #292929); } """ class W2(QtGui.QDialog): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.lineEdit = QtGui.QLineEdit() self.label1 = QtGui.QLabel(u"从父窗口接收") self.label2 = QtGui.QLabel(u"发送给父窗口") self.lineEdit1 = QtGui.QLineEdit() self.lineEdit2 = QtGui.QLineEdit() self.button2 = QtGui.QPushButton(u'发送',self) layout = QtGui.QGridLayout() layout.addWidget(self.label1,0,0) layout.addWidget(self.lineEdit1,0,1) layout.addWidget(self.label2,1,0) layout.addWidget(self.lineEdit2,1,1) layout.addWidget(self.button2,2,1) self.setLayout(layout) self.setStyleSheet(style) self.button2.clicked.connect(self.transfer) def receive(self,s): print (u'接受到父窗口值') self.lineEdit1.setText(str(s)) def transfer(self): str = self.lineEdit2.text() self.emit(QtCore.SIGNAL("transfer_father"),str) class MyForm(QtGui.QDialog): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle(u'父窗口') self.label1 = QtGui.QLabel(u"从子窗口接收") self.label2 = QtGui.QLabel(u"发送给子窗口") self.lineEdit1 = QtGui.QLineEdit() self.lineEdit2 = QtGui.QLineEdit() self.button1 = QtGui.QPushButton(u'子窗口',self) self.button2 = QtGui.QPushButton(u'发送',self) layout = QtGui.QGridLayout() layout.addWidget(self.label1,0,0) layout.addWidget(self.lineEdit1,0,1) layout.addWidget(self.label2,1,0) layout.addWidget(self.lineEdit2,1,1) layout.addWidget(self.button1,2,0) layout.addWidget(self.button2,2,1) self.setLayout(layout) self.button1.clicked.connect(self.child) self.button2.clicked.connect(self.transfer) self.setStyleSheet(style) def child(self): print (u'弹出子窗口') self.w2 = W2() self.connect(self.w2, QtCore.SIGNAL("transfer_father"), self.receive) self.w2.show() self.w2.connect(self, QtCore.SIGNAL("transfer_child"), self.w2.receive) @QtCore.pyqtSlot(str) def receive(self,s): print (u'接受到子窗口值') self.lineEdit1.setText(str(s)) def transfer(self): str = self.lineEdit2.text() self.emit(QtCore.SIGNAL("transfer_child"),str) if __name__ == "__main__": app = QtGui.QApplication(sys.argv) myapp = MyForm() myapp.show() sys.exit(app.exec_())
qcs555shen 2016-03-03
  • 打赏
  • 举报
回复
请问你是怎么解决的,能共享代码吗?
yingyangcz 2015-05-27
  • 打赏
  • 举报
回复
第二个问题也解决了,self改成全局指针就行了。
csdnbuku 2015-05-26
  • 打赏
  • 举报
回复
父子窗口传值这一点已经搞清楚了。就是第二个问题现在有点疑问了。
csdnbuku 2015-05-26
  • 打赏
  • 举报
回复
刚才又百度找了下,胡乱试了下。 第一个问题已经解决了。 还有第二个问题。
csdnbuku 2015-05-26
  • 打赏
  • 举报
回复

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧