PyQt4的一些问题汇总

  • (1)PyQt4获取中文路径名字乱码问题

网址可以参见:http://permalink.gmane.org/gmane.comp.python.chinese/9916

处理方式的代码可以参考如下

#[1]第一种写法
filePath = unicode(QtGui.QFileDialog.getOpenFileName(None, "All Files (*)", self))
#[2]第二种写法
filechoose = QtGui.QFileDialog(self)
filePath = unicode(filechoose.getOpenFileName())
  •  (2)PyQt4读取文件,但是对话框打开两次

网址可以参考:http://bbs.csdn.net/topics/390948296

上面的网址帖子没人回

下面的帖子不是PyQt4,是C#,但是我发现问题是一样的

http://bbs.csdn.net/topics/380009233

即在如下代码区区域多写了一个定义声明,造成对话框打开两次

#伪代码
class Function():
    def __init__():
        QWidget.__init__(self, parent)
        self.setupUi(self)         
        QtCore.QObject.connect(self.读取文件的对话框按钮对象,QtCore.SIGNAL("clicked()"), self.读取文件的对话框按钮对象的点击触发操作)
        #请注意,上面这句话导致对话框打开两次,所以注释掉本句即可,就会变成正常的对话框打开一次

    @pyqtSignature("")
    def 读取文件的对话框按钮对象的点击触发操作(self):
        filechoose = QtGui.QFileDialog(self)
        filepath_meta_of_tab = unicode(filechoose.getOpenFileName())
        content_meta_of_tab = open(filepath_meta_of_tab).read()
        self.M1_InputPath.setText( filepath_meta_of_tab )

 

通过后来的资料,寻找发现有相关博客说明,网址为http://www.cnblogs.com/moodlxs/archive/2013/03/16/2963966.html

原因不仅仅是多了一个声明,原文引用如下:

在PyQt4中,界面代码与事件代码是分开的,这一点很赞,这样每次改界面就不会影响到事件处理的代码了。而wxPython这一点就做得不好。

事件处理要新建一个类并继承DlgHello类,然后在这个新类里写事件处理函数。新建类的工作可以交给Eric4来完成。右键点 DlgHello.ui,选择Generate Dialog Code,在弹出的对话框中设定ClassName为DlgHello,同时,在这个对话框中可以选择我们感兴趣的事件,Eric4会一并生成事件处理函 数的定义。

点确定之后,DlgHello.py就生成了。打开这个文件,“你好”按钮的事件被定义为:

@pyqtSignature("")
def on_btnHello_clicked(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
raise NotImplementedError

注意这个@pyqtSignature("")自动处理了下面定义的槽slot(事件处理函数)与相对应的信号signal(事件)之间的关联,单击 btnHello按钮,就会自动执行这个函数。slot的命名规则就是”on_对像名_信号名”,如果想添加新的slot,按这个规则来添加函数就行,并 且在函数定义语句之前加上@pyqtSignature(""),不用再重新生成一次DlgHello.py文件。

其实另外一种关联signal与slot之间的方法是在运行里绑定,比如按钮对象btnAbout的clicked信号的槽是about_clicked函数,那么在__init__函数中加入这样一句话:
PyQt4.QtCore.QObject.connect(self.btnAbout, PyQt4.QtCore.SIGNAL("clicked()"), self.about_clicked)
那么单击按钮btnAbout时就会执行about_clicked函数。

两种方法各有长处。第一种方法简单,第二种方法对于多个signal使用同一个slot时很有效。

 

你可能感兴趣的:(qt)