Bookmarks

Yahoo Gmail Google Facebook Delicious Twitter Reddit Stumpleupon Myspace Digg

Search queries

jagne kvrj, ngochan1126@hotmail.­com, a asdfghjhhjjkl', cvezrtg, chink chinese frankies, lambhead@rocketmail.com, priwalfdept77@yahoo.de, from scipy.optimize import minpack2 ImportError: DLL load failed: 找不到指定的模块。, yamlå, adfghjshjklç

Links

XODOX
Impressum

#1: pyqt中cellChanged信号需要在tablewidget中编辑两次才能触发

Posted on 2012-09-11 07:06:46 by 双人鱼

最近做一个小桌面软件的界面,由于水平有限,让自已吃尽了苦头。好在有老鱼版主等这些大牛的帮助下,让自已逐步进步。
最近做界面,中心部件用的是QTableWidget,由于需要用到判断表格数据是否被修改的功能,所以求助了各位大牛。在大牛的帮助下使用了cellChanged,使得界面能正常运行。但发现只有对两个单元格进行编辑后才能触发信号cellChanged,不知是为什么,又应怎样解决?
我做的测试是这样的。运行代码后,对表格中的一个单元格进行了编辑,然后点击打开按钮,按自已的设计应弹出提示保存的对话框,但实际上没有弹出。也就是说cellChanged信号并没有触发。但是如果再对另一个单元格进行辑,再按打开按钮时,则可以正常地弹出提示保存的对话框。
我现在只做打开按钮的测试,所以其它部分的代码还没有修改。代码如下:

#!/usr/bin/env python
#coding=utf-8
import sip
sip.setapi('QVariant', 2)

from PyQt4 import QtCore, QtGui

import application_rc


class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()


self.table = QtGui.QTableWidget(5,5)
self.setCentralWidget(self.table)
self.new_dirty()
self.table.cellChanged.connect(self.makeDirty)

self.createActions()
self.createMenus()
self.createToolBars()
self.createStatusBar()


def new_dirty(self):
self.dirty = False #创建新表格时,文档重新设置为未修改

def makeDirty(self):
self.dirty = True



def newFile(self):
if self.maybeSave():
self.textEdit.clear()
self.setCurrentFile('')
#函数作用:新建文件点击后实现的方法(槽)。当点击新建,如果当前以有打开的文本,
#先判断文本是否被修改保存,如果没被修改,直接把文本编辑的内容清掉,并把新建的文本名设为Untitle.txt。
#如果已经被修改,就执行maybeSave()里的 return slotSave();进行保存

def open(self):
if self.maybeSave():#maybeSave()用来判断当前已修改的文件是否进行了保存
fileName = QtGui.QFileDialog.getOpenFileName(self)
if fileName:
self.loadFile(fileName)
#函数作用:点击打开选项实现的方法(槽)
#点击打开文本,先判断当前已经打开的文本是否保存
#如果保存了,就跳出文件对话框,输入要打开的文件名,并把该文件名赋值给fileName,fileName不为空,打开该文件


def save(self):
if self.curFile:
return self.saveFile(self.curFile)

return self.saveAs()
#函数作用:点击保存所实现的方法(槽)
#如果当前文本名为空,就执行另存为方法
#如果不为空,就执行保存文本的方法

def saveAs(self):
fileName = QtGui.QFileDialog.getSaveFileName(self)
if fileName:
return self.saveFile(fileName)
return False
#函数作用:点击另存为选项实现的方法
#点击另存为跳出文件对话框,输入另存为名字并把改名字赋值给fileName
#如果没输入另存为名字而是选择了取消,返回false
#如果输入,用这个名字保存文本



def createActions(self):
self.newAct = QtGui.QAction(QtGui.QIcon(':/images/new.png'), u"新建(&N)",
self, shortcut=QtGui.QKeySequence.New,
statusTip=u"新建一个文档", triggered=self.newFile)

self.openAct = QtGui.QAction(QtGui.QIcon(':/images/open.png'),
u"打开(&O)...", self, shortcut=QtGui.QKeySequence.Open,
statusTip=u"打开一个现存的文档", triggered=self.open)

self.saveAct = QtGui.QAction(QtGui.QIcon(':/images/save.png'),
u"保存(&S)", self, shortcut=QtGui.QKeySequence.Save,
statusTip=u"保存活动文档", triggered=self.save)

self.saveAsAct = QtGui.QAction(u"另存为(&A)...", self,
shortcut=QtGui.QKeySequence.SaveAs,
statusTip=u"用新名称保存该活动文档",
triggered=self.saveAs)

self.exitAct = QtGui.QAction(u"退出(&X)", self, shortcut="Ctrl+Q",
statusTip=u"退出程序,提示保存文档", triggered=self.close)


def createMenus(self):
self.fileMenu = self.menuBar().addMenu(u"文件(&F)")
self.fileMenu.addAction(self.newAct)
self.fileMenu.addAction(self.openAct)
self.fileMenu.addAction(self.saveAct)
self.fileMenu.addAction(self.saveAsAct)
self.fileMenu.addSeparator();
self.fileMenu.addAction(self.exitAct)



def createToolBars(self):
self.fileToolBar = self.addToolBar("File")
self.fileToolBar.addAction(self.newAct)
self.fileToolBar.addAction(self.openAct)
self.fileToolBar.addAction(self.saveAct)



def createStatusBar(self):
self.statusBar().showMessage("Ready")



def maybeSave(self):#函数作用:判断文件是否保存了
if self.dirty:#调用 Add、Clear、Insert 或 Remove 方法后,IsModified 属性为 true。 此外,使用 Item 属性修改字符串集合的元素后,IsModified 属性也为 true。
#是判断文本编辑的内容是否被修改,如果被修改就跳出一个警告对话框,问是否保存、忽略、取消。
ret = QtGui.QMessageBox.warning(self, u"supermemo伴侣 (鱼版)",
u"文本内容已经被修改\n你想保存被修改的内容吗?",
QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard |
QtGui.QMessageBox.Cancel)
if ret == QtGui.QMessageBox.Save:
return self.save()#如果选择保存,执行保存方法;
elif ret == QtGui.QMessageBox.Cancel:
return False#如果选择取消,返回false
return True#如果没被修改,返回true
#判断文件是否保存函数maybeSave()的返回值如下:
#1、如果文本保存过了,也就是没被修改,则返回True
#2、如果文本被修改过了,并且在弹出的警告对话框中选择了取消,则返回False
#3、如果文本被修改过了,并且在弹出的警告对话框中选择了保存,则不返回任何值,直接执行保存函数self.save()



def saveFile(self, fileName):
file = QtCore.QFile(fileName)
if not file.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
QtGui.QMessageBox.warning(self, "Application",
"Cannot write file %s:\n%s." % (fileName, file.errorString()))
return False

outf = QtCore.QTextStream(file)
QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
outf << self.textEdit.toPlainText()
QtGui.QApplication.restoreOverrideCursor()

self.setCurrentFile(fileName);
self.statusBar().showMessage("File saved", 2000)
return True
#函数作用:把文本编辑的内容保存到文本里面
#先新建文本,打开文本,如果打开失败会跳出一个错误对话框,显示不能写
#如果打开成功,新建一个文本流out,把文本编辑的内容都输出到文本流,并设置当前的文本名为保存时写的文本名。



if __name__ == '__main__':

import sys

app = QtGui.QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())

--

※ 来源:・水木社区 http://newsmth.net・

Report this message