diff options
Diffstat (limited to 'examples/widgets/mainwindows/dockwidgets/dockwidgets.py')
-rw-r--r-- | examples/widgets/mainwindows/dockwidgets/dockwidgets.py | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/examples/widgets/mainwindows/dockwidgets/dockwidgets.py b/examples/widgets/mainwindows/dockwidgets/dockwidgets.py new file mode 100644 index 000000000..29443878a --- /dev/null +++ b/examples/widgets/mainwindows/dockwidgets/dockwidgets.py @@ -0,0 +1,304 @@ +#!/usr/bin/env python + +############################################################################# +## +## Copyright (C) 2013 Riverbank Computing Limited. +## Copyright (C) 2016 The Qt Company Ltd. +## Contact: http://www.qt.io/licensing/ +## +## This file is part of the PySide examples of the Qt Toolkit. +## +## $QT_BEGIN_LICENSE:BSD$ +## You may use this file under the terms of the BSD license as follows: +## +## "Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are +## met: +## * Redistributions of source code must retain the above copyright +## notice, this list of conditions and the following disclaimer. +## * Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in +## the documentation and/or other materials provided with the +## distribution. +## * Neither the name of The Qt Company Ltd nor the names of its +## contributors may be used to endorse or promote products derived +## from this software without specific prior written permission. +## +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +## +## $QT_END_LICENSE$ +## +############################################################################# + +"""PySide2 port of the widgets/mainwindows/dockwidgets example from Qt v5.x, originating from PyQt""" + +from PySide2.QtCore import QDate, QFile, Qt, QTextStream +from PySide2.QtGui import (QFont, QIcon, QKeySequence, QTextCharFormat, + QTextCursor, QTextTableFormat) +from PySide2.QtPrintSupport import QPrintDialog, QPrinter +from PySide2.QtWidgets import (QAction, QApplication, QDialog, QDockWidget, + QFileDialog, QListWidget, QMainWindow, QMessageBox, QTextEdit) + +import dockwidgets_rc + + +class MainWindow(QMainWindow): + def __init__(self): + super(MainWindow, self).__init__() + + self.textEdit = QTextEdit() + self.setCentralWidget(self.textEdit) + + self.createActions() + self.createMenus() + self.createToolBars() + self.createStatusBar() + self.createDockWindows() + + self.setWindowTitle("Dock Widgets") + + self.newLetter() + + def newLetter(self): + self.textEdit.clear() + + cursor = self.textEdit.textCursor() + cursor.movePosition(QTextCursor.Start) + topFrame = cursor.currentFrame() + topFrameFormat = topFrame.frameFormat() + topFrameFormat.setPadding(16) + topFrame.setFrameFormat(topFrameFormat) + + textFormat = QTextCharFormat() + boldFormat = QTextCharFormat() + boldFormat.setFontWeight(QFont.Bold) + italicFormat = QTextCharFormat() + italicFormat.setFontItalic(True) + + tableFormat = QTextTableFormat() + tableFormat.setBorder(1) + tableFormat.setCellPadding(16) + tableFormat.setAlignment(Qt.AlignRight) + cursor.insertTable(1, 1, tableFormat) + cursor.insertText("The Firm", boldFormat) + cursor.insertBlock() + cursor.insertText("321 City Street", textFormat) + cursor.insertBlock() + cursor.insertText("Industry Park") + cursor.insertBlock() + cursor.insertText("Some Country") + cursor.setPosition(topFrame.lastPosition()) + cursor.insertText(QDate.currentDate().toString("d MMMM yyyy"), + textFormat) + cursor.insertBlock() + cursor.insertBlock() + cursor.insertText("Dear ", textFormat) + cursor.insertText("NAME", italicFormat) + cursor.insertText(",", textFormat) + for i in range(3): + cursor.insertBlock() + cursor.insertText("Yours sincerely,", textFormat) + for i in range(3): + cursor.insertBlock() + cursor.insertText("The Boss", textFormat) + cursor.insertBlock() + cursor.insertText("ADDRESS", italicFormat) + + def print_(self): + document = self.textEdit.document() + printer = QPrinter() + + dlg = QPrintDialog(printer, self) + if dlg.exec_() != QDialog.Accepted: + return + + document.print_(printer) + + self.statusBar().showMessage("Ready", 2000) + + def save(self): + filename, _ = QFileDialog.getSaveFileName(self, + "Choose a file name", '.', "HTML (*.html *.htm)") + if not filename: + return + + file = QFile(filename) + if not file.open(QFile.WriteOnly | QFile.Text): + QMessageBox.warning(self, "Dock Widgets", + "Cannot write file %s:\n%s." % (filename, file.errorString())) + return + + out = QTextStream(file) + QApplication.setOverrideCursor(Qt.WaitCursor) + out << self.textEdit.toHtml() + QApplication.restoreOverrideCursor() + + self.statusBar().showMessage("Saved '%s'" % filename, 2000) + + def undo(self): + document = self.textEdit.document() + document.undo() + + def insertCustomer(self, customer): + if not customer: + return + customerList = customer.split(', ') + document = self.textEdit.document() + cursor = document.find('NAME') + if not cursor.isNull(): + cursor.beginEditBlock() + cursor.insertText(customerList[0]) + oldcursor = cursor + cursor = document.find('ADDRESS') + if not cursor.isNull(): + for i in customerList[1:]: + cursor.insertBlock() + cursor.insertText(i) + cursor.endEditBlock() + else: + oldcursor.endEditBlock() + + def addParagraph(self, paragraph): + if not paragraph: + return + document = self.textEdit.document() + cursor = document.find("Yours sincerely,") + if cursor.isNull(): + return + cursor.beginEditBlock() + cursor.movePosition(QTextCursor.PreviousBlock, QTextCursor.MoveAnchor, + 2) + cursor.insertBlock() + cursor.insertText(paragraph) + cursor.insertBlock() + cursor.endEditBlock() + + def about(self): + QMessageBox.about(self, "About Dock Widgets", + "The <b>Dock Widgets</b> example demonstrates how to use " + "Qt's dock widgets. You can enter your own text, click a " + "customer to add a customer name and address, and click " + "standard paragraphs to add them.") + + def createActions(self): + self.newLetterAct = QAction(QIcon.fromTheme('document-new', QIcon(':/images/new.png')), "&New Letter", + self, shortcut=QKeySequence.New, + statusTip="Create a new form letter", triggered=self.newLetter) + + self.saveAct = QAction(QIcon.fromTheme('document-save', QIcon(':/images/save.png')), "&Save...", self, + shortcut=QKeySequence.Save, + statusTip="Save the current form letter", triggered=self.save) + + self.printAct = QAction(QIcon.fromTheme('document-print', QIcon(':/images/print.png')), "&Print...", self, + shortcut=QKeySequence.Print, + statusTip="Print the current form letter", + triggered=self.print_) + + self.undoAct = QAction(QIcon.fromTheme('edit-undo', QIcon(':/images/undo.png')), "&Undo", self, + shortcut=QKeySequence.Undo, + statusTip="Undo the last editing action", triggered=self.undo) + + self.quitAct = QAction("&Quit", self, shortcut="Ctrl+Q", + statusTip="Quit the application", triggered=self.close) + + self.aboutAct = QAction("&About", self, + statusTip="Show the application's About box", + triggered=self.about) + + self.aboutQtAct = QAction("About &Qt", self, + statusTip="Show the Qt library's About box", + triggered=QApplication.instance().aboutQt) + + def createMenus(self): + self.fileMenu = self.menuBar().addMenu("&File") + self.fileMenu.addAction(self.newLetterAct) + self.fileMenu.addAction(self.saveAct) + self.fileMenu.addAction(self.printAct) + self.fileMenu.addSeparator() + self.fileMenu.addAction(self.quitAct) + + self.editMenu = self.menuBar().addMenu("&Edit") + self.editMenu.addAction(self.undoAct) + + self.viewMenu = self.menuBar().addMenu("&View") + + self.menuBar().addSeparator() + + self.helpMenu = self.menuBar().addMenu("&Help") + self.helpMenu.addAction(self.aboutAct) + self.helpMenu.addAction(self.aboutQtAct) + + def createToolBars(self): + self.fileToolBar = self.addToolBar("File") + self.fileToolBar.addAction(self.newLetterAct) + self.fileToolBar.addAction(self.saveAct) + self.fileToolBar.addAction(self.printAct) + + self.editToolBar = self.addToolBar("Edit") + self.editToolBar.addAction(self.undoAct) + + def createStatusBar(self): + self.statusBar().showMessage("Ready") + + def createDockWindows(self): + dock = QDockWidget("Customers", self) + dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) + self.customerList = QListWidget(dock) + self.customerList.addItems(( + "John Doe, Harmony Enterprises, 12 Lakeside, Ambleton", + "Jane Doe, Memorabilia, 23 Watersedge, Beaton", + "Tammy Shea, Tiblanka, 38 Sea Views, Carlton", + "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal", + "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston", + "Sally Hobart, Tiroli Tea, 67 Long River, Fedula")) + dock.setWidget(self.customerList) + self.addDockWidget(Qt.RightDockWidgetArea, dock) + self.viewMenu.addAction(dock.toggleViewAction()) + + dock = QDockWidget("Paragraphs", self) + self.paragraphsList = QListWidget(dock) + self.paragraphsList.addItems(( + "Thank you for your payment which we have received today.", + "Your order has been dispatched and should be with you within " + "28 days.", + "We have dispatched those items that were in stock. The rest of " + "your order will be dispatched once all the remaining items " + "have arrived at our warehouse. No additional shipping " + "charges will be made.", + "You made a small overpayment (less than $5) which we will keep " + "on account for you, or return at your request.", + "You made a small underpayment (less than $1), but we have sent " + "your order anyway. We'll add this underpayment to your next " + "bill.", + "Unfortunately you did not send enough money. Please remit an " + "additional $. Your order will be dispatched as soon as the " + "complete amount has been received.", + "You made an overpayment (more than $5). Do you wish to buy more " + "items, or should we return the excess to you?")) + dock.setWidget(self.paragraphsList) + self.addDockWidget(Qt.RightDockWidgetArea, dock) + self.viewMenu.addAction(dock.toggleViewAction()) + + self.customerList.currentTextChanged.connect(self.insertCustomer) + self.paragraphsList.currentTextChanged.connect(self.addParagraph) + + +if __name__ == '__main__': + + import sys + + app = QApplication(sys.argv) + mainWin = MainWindow() + mainWin.show() + sys.exit(app.exec_()) |