今天在试着为笔记软件写个编辑器,然后参考qt自带的textedit的示例。下面是一个撤销操作的一段代码,我就疑惑了,这跟用QPushButton应该差不多吧。
self.actionUndo = QtGui.QAction(
QtGui.QIcon.fromTheme(‘edit-undo‘, QtGui.QIcon(rsrcPath + ‘/editundo.png‘)), "&Undo", self, shortcut=QtGui.QKeySequence.Undo) tb.addAction(self.actionUndo) menu.addAction(self.actionUndo)
# -*- coding:utf8 -*- import sip sip.setapi(‘QString‘, 2) from PyQt4 import QtCore, QtGui from PyQt4.QtCore import * from PyQt4.QtGui import * import mainQss # NoDragCombo这个类是为了防止拖动Combobox所带来的bug class NoDragCombo(QComboBox): def __init__(self, parent=None): QComboBox.__init__(self, parent) def mouseMoveEvent(self, QMouseEvent): pass def mouseReleaseEvent(self, QMouseEvent): pass class NoDragFontCombo(QFontComboBox): def __init__(self, parent=None): QFontComboBox.__init__(self, parent) def mouseMoveEvent(self, QMouseEvent): pass def mouseReleaseEvent(self, QMouseEvent): pass class CenterWidget(QWidget): def __init__(self, fileName=None, parent=None): QWidget.__init__(self, parent) self.initAllObjects() self.setupFileActions() self.setupEditActions() self.setupTextActions() self.setupTextEdit() self.setupStyleSheet() self.setupMainUi() self.fontChanged(self.textEdit.font()) self.colorChanged(self.textEdit.textColor()) self.alignmentChanged(self.textEdit.alignment()) self.textEdit.document().modificationChanged.connect( self.actionSave.setEnabled) self.textEdit.document().modificationChanged.connect( self.setWindowModified) self.textEdit.document().undoAvailable.connect( self.actionUndo.setEnabled) self.textEdit.document().redoAvailable.connect( self.actionRedo.setEnabled) self.actionSave.setEnabled(self.textEdit.document().isModified()) self.actionUndo.setEnabled(self.textEdit.document().isUndoAvailable()) self.actionRedo.setEnabled(self.textEdit.document().isRedoAvailable()) self.actionUndo.triggered.connect(self.textEdit.undo) self.actionRedo.triggered.connect(self.textEdit.redo) self.actionCut.setEnabled(False) self.actionCopy.setEnabled(False) self.actionCut.triggered.connect(self.textEdit.cut) self.actionCopy.triggered.connect(self.textEdit.copy) self.actionPaste.triggered.connect(self.textEdit.paste) self.textEdit.copyAvailable.connect(self.actionCut.setEnabled) self.textEdit.copyAvailable.connect(self.actionCopy.setEnabled) QtGui.QApplication.clipboard().dataChanged.connect( self.clipboardDataChanged) def initAllObjects(self): self.oneStyle = QStyleFactory.create("plastique") self.textEdit = QTextEdit(self) self.layout = QVBoxLayout(self) self.topLayout = QHBoxLayout() self.topWidget = QWidget(self) self.topWidgetLayout = QHBoxLayout(self.topWidget) self.fileBtn = QPushButton("File",self.topWidget) self.editBtn = QPushButton("Edit",self.topWidget) self.textBtn = QPushButton("Text",self.topWidget) self.comboFont = NoDragFontCombo(self.topWidget) self.comboSize = NoDragCombo(self.topWidget) self.comboStyle = NoDragCombo(self.topWidget) def setupStyleSheet(self): # self.fileBtn.setStyleSheet(mainQss.writeButton) # self.fileBtn.setGeometry(2, 1, 24, 24) # self.editBtn.setStyleSheet(mainQss.writeButton) # self.editBtn.setGeometry(28, 1, 24, 24) # self.textBtn.setStyleSheet(mainQss.writeButton) # self.textBtn.setGeometry(54, 1, 24, 24) # self.comboFont.setGeometry(80, 1, 100, 24) # self.comboSize.setGeometry(182, 1, 100, 24) # self.comboStyle.setGeometry(284, 1, 100, 24) self.fileBtn.setStyle(self.oneStyle) self.editBtn.setStyle(self.oneStyle) self.textBtn.setStyle(self.oneStyle) self.comboStyle.setStyle(self.oneStyle) self.comboSize.setStyle(self.oneStyle) self.comboFont.setStyle(self.oneStyle) self.topWidget.setMinimumHeight(26) # self.topWidget.setMaximumHeight(26) self.topWidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum) self.topLayout.setContentsMargins(0, 0, 0, 0) self.layout.setContentsMargins(0, 0, 0, 0) self.layout.setSpacing(0) def setupTextEdit(self): self.textEdit.setFocus() oneFont = QFont("Times New Romane", 13, QFont.Normal, False) self.textEdit.setFont(oneFont) self.textEdit.currentCharFormatChanged.connect( self.currentCharFormatChanged) self.textEdit.cursorPositionChanged.connect(self.cursorPositionChanged) self.setCurrentFileName() def setupMainUi(self): self.topLayout.addWidget(self.topWidget) self.layout.addLayout(self.topLayout) self.layout.addWidget(self.textEdit) self.setLayout(self.layout) self.topWidgetLayout.addWidget(self.fileBtn) self.topWidgetLayout.addWidget(self.editBtn) self.topWidgetLayout.addWidget(self.textBtn) self.topWidgetLayout.addWidget(self.comboFont) self.topWidgetLayout.addWidget(self.comboSize) self.topWidgetLayout.addWidget(self.comboStyle) def setupFileActions(self): menu = QMenu("&File", self) self.fileBtn.setMenu(menu) self.actionNew = QAction("&New", self, priority=QAction.LowPriority, shortcut=QKeySequence.New, triggered=self.fileNew) menu.addAction(self.actionNew) self.actionNew = QtGui.QAction( "&New", self, priority=QtGui.QAction.LowPriority, shortcut=QtGui.QKeySequence.New, triggered=self.fileNew) menu.addAction(self.actionNew) self.actionOpen = QtGui.QAction( "&Open...", self, shortcut=QtGui.QKeySequence.Open, triggered=self.fileOpen) menu.addAction(self.actionOpen) menu.addSeparator() self.actionSave = QtGui.QAction( "&Save", self, shortcut=QtGui.QKeySequence.Save, triggered=self.fileSave, enabled=False) menu.addAction(self.actionSave) self.actionSaveAs = QtGui.QAction("Save &As...", self, priority=QtGui.QAction.LowPriority, shortcut=QtCore.Qt.CTRL + QtCore.Qt.SHIFT + QtCore.Qt.Key_S, triggered=self.fileSaveAs) menu.addAction(self.actionSaveAs) menu.addSeparator() self.actionPrint = QtGui.QAction( "&Print...", self, priority=QtGui.QAction.LowPriority, shortcut=QtGui.QKeySequence.Print, triggered=self.filePrint) menu.addAction(self.actionPrint) self.actionPrintPreview = QtGui.QAction( "Print Preview...", self, shortcut=QtCore.Qt.CTRL + QtCore.Qt.SHIFT + QtCore.Qt.Key_P, triggered=self.filePrintPreview) menu.addAction(self.actionPrintPreview) self.actionPrintPdf = QtGui.QAction( "&Export PDF...", self, priority=QtGui.QAction.LowPriority, shortcut=QtCore.Qt.CTRL + QtCore.Qt.Key_D, triggered=self.filePrintPdf) menu.addAction(self.actionPrintPdf) menu.addSeparator() self.actionQuit = QtGui.QAction("&Quit", self, shortcut=QtGui.QKeySequence.Quit, triggered=self.close) menu.addAction(self.actionQuit) def setupEditActions(self): menu = QMenu("&Edit", self) self.editBtn.setMenu(menu) self.actionUndo = QtGui.QAction( "&Undo", self, shortcut=QtGui.QKeySequence.Undo) menu.addAction(self.actionUndo) self.actionRedo = QtGui.QAction( "&Redo", self, priority=QtGui.QAction.LowPriority, shortcut=QtGui.QKeySequence.Redo) menu.addAction(self.actionRedo) menu.addSeparator() self.actionCut = QtGui.QAction( "Cu&t", self, priority=QtGui.QAction.LowPriority, shortcut=QtGui.QKeySequence.Cut) menu.addAction(self.actionCut) self.actionCopy = QtGui.QAction( "&Copy", self, priority=QtGui.QAction.LowPriority, shortcut=QtGui.QKeySequence.Copy) menu.addAction(self.actionCopy) self.actionPaste = QtGui.QAction( "&Paste", self, priority=QtGui.QAction.LowPriority, shortcut=QtGui.QKeySequence.Paste, enabled=(len(QtGui.QApplication.clipboard().text()) != 0)) menu.addAction(self.actionPaste) def fileNew(self): print "create new file" if self.maybeSave(): self.textEdit.clear() self.setCurrentFileName() def fileOpen(self): print "open file" fn = QFileDialog.getOpenFileName(self, "Open File...", None, "HTML-Files (*.htm *html);;ALL Files (*)") if fn: self.load(fn) def filePrint(self): printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution) dlg = QtGui.QPrintDialog(printer, self) if self.textEdit.textCursor().hasSelection(): dlg.addEnabledOption(QtGui.QAbstractPrintDialog.PrintSelection) dlg.setWindowTitle("Print Document") if dlg.exec_() == QtGui.QDialog.Accepted: self.textEdit.print_(printer) del dlg def filePrintPdf(self): print "print pdf" fn = QtGui.QFileDialog.getSaveFileName(self, "Export PDF", None, "PDF files (*.pdf);;All Files (*)") if fn: if QtCore.QFileInfo(fn).suffix().isEmpty(): fn += ‘.pdf‘ printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution) printer.setOutputFormat(QtGui.QPrinter.PdfFormat) printer.setOutputFileName(fileName) self.textEdit.document().print_(printer) def printPreview(self, printer): self.textEdit.print_(printer) def filePrintPreview(self): print "print Preview" printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution) preview = QtGui.QPrintPreviewDialog(printer, self) preview.paintRequested.connect(self.printPreview) preview.exec_() def fileSave(self): print "save file" if not self.fileName: return self.fileSaveAs() writer = QTextDocumentWriter(self.fileName) success = writer.write(self.textEdit.document()) if success: self.textEdit.document().setModified(False) return success def fileSaveAs(self): print "file save as" fn = QtGui.QFileDialog.getSaveFileName(self, "Save as...", "C:/", "ODF files (*.odt);;HTML-Files (*.htm *.html);;All Files (*)") if not fn: return False lfn = fn.lower() if not lfn.endswith((‘.odt‘, ‘.htm‘, ‘.html‘)): # The default. fn += ‘.odt‘ self.setCurrentFileName(fn) return self.fileSave() def load(self, f): if not QtCore.QFile.exists(f): return False fh = QtCore.QFile(f) if not fh.open(QtCore.QFile.ReadOnly): return False data = fh.readAll() codec = QtCore.QTextCodec.codecForHtml(data) unistr = codec.toUnicode(data) if QtCore.Qt.mightBeRichText(unistr): self.textEdit.setHtml(unistr) else: self.textEdit.setPlainText(unistr) self.setCurrentFileName(f) return True def maybeSave(self): if not self.textEdit.document().isModified(): return True if self.fileName.startswith(‘:/‘): return True ret = QtGui.QMessageBox.warning(self, "Application", "The document has been modified.\n" "Do you want to save your changes?", QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard | QtGui.QMessageBox.Cancel) if ret == QtGui.QMessageBox.Save: return self.fileSave() if ret == QtGui.QMessageBox.Cancel: return False return True def setupTextActions(self): menu = QtGui.QMenu("F&ormat", self) self.textBtn.setMenu(menu) self.actionTextBold = QtGui.QAction( "&Bold", self, priority=QtGui.QAction.LowPriority, shortcut=QtCore.Qt.CTRL + QtCore.Qt.Key_B, triggered=self.textBold, checkable=True) bold = QtGui.QFont() bold.setBold(True) self.actionTextBold.setFont(bold) menu.addAction(self.actionTextBold) self.actionTextItalic = QtGui.QAction( "&Italic", self, priority=QtGui.QAction.LowPriority, shortcut=QtCore.Qt.CTRL + QtCore.Qt.Key_I, triggered=self.textItalic, checkable=True) italic = QtGui.QFont() italic.setItalic(True) self.actionTextItalic.setFont(italic) menu.addAction(self.actionTextItalic) self.actionTextUnderline = QtGui.QAction( "&Underline", self, priority=QtGui.QAction.LowPriority, shortcut=QtCore.Qt.CTRL + QtCore.Qt.Key_U, triggered=self.textUnderline, checkable=True) underline = QtGui.QFont() underline.setUnderline(True) self.actionTextUnderline.setFont(underline) menu.addAction(self.actionTextUnderline) menu.addSeparator() grp = QtGui.QActionGroup(self, triggered=self.textAlign) # Make sure the alignLeft is always left of the alignRight. if QtGui.QApplication.isLeftToRight(): self.actionAlignLeft = QtGui.QAction( "&Left", grp) self.actionAlignCenter = QtGui.QAction( "C&enter", grp) self.actionAlignRight = QtGui.QAction( "&Right", grp) else: self.actionAlignRight = QtGui.QAction( "&Right", grp) self.actionAlignCenter = QtGui.QAction( "C&enter", grp) self.actionAlignLeft = QtGui.QAction( "&Left", grp) self.actionAlignJustify = QtGui.QAction( "&Justify", grp) self.actionAlignLeft.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_L) self.actionAlignLeft.setCheckable(True) self.actionAlignLeft.setPriority(QtGui.QAction.LowPriority) self.actionAlignCenter.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_E) self.actionAlignCenter.setCheckable(True) self.actionAlignCenter.setPriority(QtGui.QAction.LowPriority) self.actionAlignRight.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_R) self.actionAlignRight.setCheckable(True) self.actionAlignRight.setPriority(QtGui.QAction.LowPriority) self.actionAlignJustify.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_J) self.actionAlignJustify.setCheckable(True) self.actionAlignJustify.setPriority(QtGui.QAction.LowPriority) menu.addSeparator() pix = QtGui.QPixmap(16, 16) pix.fill(QtCore.Qt.black) self.actionTextColor = QtGui.QAction(QtGui.QIcon(pix), "&Color...", self, triggered=self.textColor) menu.addAction(self.actionTextColor) self.comboStyle.addItem("Standard") self.comboStyle.addItem("Bullet List (Disc)") self.comboStyle.addItem("Bullet List (Circle)") self.comboStyle.addItem("Bullet List (Square)") self.comboStyle.addItem("Ordered List (Decimal)") self.comboStyle.addItem("Ordered List (Alpha lower)") self.comboStyle.addItem("Ordered List (Alpha upper)") self.comboStyle.addItem("Ordered List (Roman lower)") self.comboStyle.addItem("Ordered List (Roman upper)") self.comboStyle.activated.connect(self.textStyle) self.comboFont.activated[str].connect(self.textFamily) self.comboSize.setObjectName("comboSize") self.comboSize.setEditable(True) db = QtGui.QFontDatabase() for size in db.standardSizes(): self.comboSize.addItem("%s" % (size)) self.comboSize.activated[str].connect(self.textSize) self.comboSize.setCurrentIndex( self.comboSize.findText( "%s" % (QtGui.QApplication.font().pointSize()))) def textAlign(self): print "text align" def textBold(self): print "text bold" fmt = QTextCharFormat() fmt.setFontWeight(self.actionTextBold.isChecked() and QFont.Bold or QFont.Normal) self.mergeFormatOnWordOrSelection(fmt) def textUnderline(self): fmt = QtGui.QTextCharFormat() fmt.setFontUnderline(self.actionTextUnderline.isChecked()) self.mergeFormatOnWordOrSelection(fmt) def textItalic(self): fmt = QtGui.QTextCharFormat() fmt.setFontItalic(self.actionTextItalic.isChecked()) self.mergeFormatOnWordOrSelection(fmt) def textFamily(self, family): fmt = QtGui.QTextCharFormat() fmt.setFontFamily(family) self.mergeFormatOnWordOrSelection(fmt) def textSize(self, pointSize): pointSize = float(pointSize) if pointSize > 0: fmt = QtGui.QTextCharFormat() fmt.setFontPointSize(pointSize) self.mergeFormatOnWordOrSelection(fmt) def textStyle(self, styleIndex): cursor = self.textEdit.textCursor() if styleIndex: styleDict = { 1: QtGui.QTextListFormat.ListDisc, 2: QtGui.QTextListFormat.ListCircle, 3: QtGui.QTextListFormat.ListSquare, 4: QtGui.QTextListFormat.ListDecimal, 5: QtGui.QTextListFormat.ListLowerAlpha, 6: QtGui.QTextListFormat.ListUpperAlpha, 7: QtGui.QTextListFormat.ListLowerRoman, 8: QtGui.QTextListFormat.ListUpperRoman, } style = styleDict.get(styleIndex, QtGui.QTextListFormat.ListDisc) cursor.beginEditBlock() blockFmt = cursor.blockFormat() listFmt = QtGui.QTextListFormat() if cursor.currentList(): listFmt = cursor.currentList().format() else: listFmt.setIndent(blockFmt.indent() + 1) blockFmt.setIndent(0) cursor.setBlockFormat(blockFmt) listFmt.setStyle(style) cursor.createList(listFmt) cursor.endEditBlock() else: bfmt = QtGui.QTextBlockFormat() bfmt.setObjectIndex(-1) cursor.mergeBlockFormat(bfmt) def textColor(self): col = QtGui.QColorDialog.getColor(self.textEdit.textColor(), self) if not col.isValid(): return fmt = QtGui.QTextCharFormat() fmt.setForeground(col) self.mergeFormatOnWordOrSelection(fmt) self.colorChanged(col) def textAlign(self, action): if action == self.actionAlignLeft: self.textEdit.setAlignment( QtCore.Qt.AlignLeft | QtCore.Qt.AlignAbsolute) elif action == self.actionAlignCenter: self.textEdit.setAlignment(QtCore.Qt.AlignHCenter) elif action == self.actionAlignRight: self.textEdit.setAlignment( QtCore.Qt.AlignRight | QtCore.Qt.AlignAbsolute) elif action == self.actionAlignJustify: self.textEdit.setAlignment(QtCore.Qt.AlignJustify) def mergeFormatOnWordOrSelection(self, format): cursor = self.textEdit.textCursor() if not cursor.hasSelection(): cursor.select(QtGui.QTextCursor.WordUnderCursor) cursor.mergeCharFormat(format) self.textEdit.mergeCurrentCharFormat(format) def currentCharFormatChanged(self, format): self.fontChanged(format.font()) self.colorChanged(format.foreground().color()) def cursorPositionChanged(self): self.alignmentChanged(self.textEdit.alignment()) def clipboardDataChanged(self): self.actionPaste.setEnabled( len(QtGui.QApplication.clipboard().text()) != 0) def setCurrentFileName(self, fileName=‘‘): self.fileName = fileName self.textEdit.document().setModified(False) if not fileName: shownName = ‘untitled.txt‘ else: shownName = QtCore.QFileInfo(fileName).fileName() self.setWindowTitle(self.tr("%s[*] - %s" % (shownName, "Rich Text"))) self.setWindowModified(False) def colorChanged(self, color): pix = QtGui.QPixmap(16, 16) pix.fill(color) self.actionTextColor.setIcon(QtGui.QIcon(pix)) def alignmentChanged(self, alignment): if alignment & QtCore.Qt.AlignLeft: self.actionAlignLeft.setChecked(True) elif alignment & QtCore.Qt.AlignHCenter: self.actionAlignCenter.setChecked(True) elif alignment & QtCore.Qt.AlignRight: self.actionAlignRight.setChecked(True) elif alignment & QtCore.Qt.AlignJustify: self.actionAlignJustify.setChecked(True) def fontChanged(self, font): self.comboFont.setCurrentIndex( self.comboFont.findText(QtGui.QFontInfo(font).family())) self.comboSize.setCurrentIndex( self.comboSize.findText("%s" % font.pointSize())) self.actionTextBold.setChecked(font.bold()) self.actionTextItalic.setChecked(font.italic()) self.actionTextUnderline.setChecked(font.underline()) class mainUi(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.setWindowFlags(Qt.FramelessWindowHint) self.setupSomeVariable() self.setupMainUi() # create all button,widget and so on self.connect(self.btnClose, SIGNAL("clicked()"), QtGui.qApp, SLOT("quit()")) self.connect(self.btnMini, SIGNAL("clicked()"),self.showMinimized) self.connect(self.btnMax, SIGNAL("clicked()"),self.showMaxNor) def setupSomeVariable(self): pass def setupMainUi(self): self.layout = QHBoxLayout(self) # main layout # three widget, left-center-right self.leftwidget = QWidget() self.centerwidget = CenterWidget() self.rightwidget = QWidget() self.leftwidget.setMaximumWidth(300) self.leftwidget.setMinimumWidth(200) self.leftwidget.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) # growflag self.centerwidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # growflag self.rightwidget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) # growflag self.centerwidget.setMinimumWidth(550) self.rightwidget.setMinimumWidth(250) self.rightwidget.setMaximumWidth(300) self.centerwidget.setObjectName(‘name‘) # customize the three widget self.leftwidget.setStyleSheet(mainQss.threeWidget) #self.centerwidget.setStyleSheet(mainQss.threeWidget) self.rightwidget.setStyleSheet(mainQss.threeWidget) # to show user headportrait headLabel = QLabel(self.rightwidget) headLabel.setStyleSheet(mainQss.headLabel) headLabel.setGeometry(25, 50, 80, 80) # set several button self.blogButton = QPushButton(u‘我的博客‘,self.rightwidget) self.blogButton.setStyleSheet(mainQss.textButton) self.blogButton.setGeometry(25, 180, 150, 30) self.blogWriteButton = QPushButton(self.rightwidget) self.blogWriteButton.setStyleSheet(mainQss.writeButton) self.blogWriteButton.setGeometry(180, 182, 24, 24) self.noteButton = QPushButton(u‘日常笔记‘,self.rightwidget) self.noteButton.setStyleSheet(mainQss.textButton) self.noteButton.setGeometry(25, 220, 150, 30) self.noteWriteButton = QPushButton(self.rightwidget) self.noteWriteButton.setStyleSheet(mainQss.writeButton) self.noteWriteButton.setGeometry(180, 222, 24, 24) self.taskButton = QPushButton(u‘今日任务‘,self.rightwidget) self.taskButton.setStyleSheet(mainQss.textButton) self.taskButton.setGeometry(25, 260, 150, 30) self.taskWriteButton = QPushButton(self.rightwidget) self.taskWriteButton.setStyleSheet(mainQss.writeButton) self.taskWriteButton.setGeometry(180, 262, 24, 24) self.btnClose = QPushButton(self.leftwidget) self.btnMini = QPushButton(self.leftwidget) self.btnMax = QPushButton(self.leftwidget) self.btnClose.setGeometry(5, 5, 24, 24) self.btnMini.setGeometry(64, 5, 24, 24) self.btnMax.setGeometry(35, 5, 24, 24) self.btnClose.setStyleSheet(mainQss.btn_close) self.btnMini.setStyleSheet(mainQss.btn_mini) self.btnMax.setStyleSheet(mainQss.btn_max) # create three sub layout self.leftLayout = QVBoxLayout() self.centerLayout = QVBoxLayout() self.rightLayout = QVBoxLayout() self.leftLayout.addWidget(self.leftwidget) self.centerLayout.addWidget(self.centerwidget) self.rightLayout.addWidget(self.rightwidget) self.layout.addLayout(self.leftLayout) self.layout.addLayout(self.centerLayout) self.layout.addLayout(self.rightLayout) # customize main layout self.layout.setContentsMargins(0,0,0,0) self.layout.setSpacing(0) self.setLayout(self.layout) self.setWindowOpacity(0.9) self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Ignored) self.resize(1000, 600) def showMaxNor(self): if self.isMaximized(): self.showNormal() self.maxToNor = False else: self.showMaximized() self.maxToNor = True def mousePressEvent(self, event): if self.isMaximized(): return if event.button() == Qt.LeftButton: self.dragPos = event.globalPos() - self.pos() event.accept() def mouseMoveEvent(self, QMouseEvent): if self.isMaximized(): return if QMouseEvent.buttons() and Qt.LeftButton: self.move(QMouseEvent.globalPos() - self.dragPos) QMouseEvent.accept() def mouseReleaseEvent(self, QMouseEvent): pass if __name__ == "__main__": import sys app = QApplication(sys.argv) mu = mainUi() mu.show() sys.exit(app.exec_())
原文:http://my.oschina.net/zjuysw/blog/308239