MSOfficeMode Example
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../../shared")
from DevMachines import __pyside2__, __pyside6__
from DevMachines import QtitanBase
from DevMachines.QtitanBase import Qtitan
from DevMachines.QtitanGrid import (getGridVersion, Grid, GridColumn, GridEditor,
GridViewOptions,
CellButtonClickEventArgs, CellButtonEventArgs, ContextMenuEventArgs,
EditorValidationEventArgs)
if __pyside2__:
from PySide2 import QtCore
from PySide2.QtCore import Qt, QTime, QDateTime, QDate
from PySide2.QtGui import QPixmap, QStandardItemModel
from PySide2.QtWidgets import (QWidget, QApplication, QVBoxLayout, QHBoxLayout, QPushButton,
QSlider, QLabel, QCheckBox, QComboBox, QMessageBox)
if __pyside6__:
from PySide6 import QtCore
from PySide6.QtCore import Qt, QTime, QDateTime, QDate
from PySide6.QtGui import QPixmap, QStandardItemModel
from PySide6.QtWidgets import (QWidget, QApplication, QVBoxLayout, QHBoxLayout, QPushButton,
QSlider, QLabel, QCheckBox, QComboBox, QMessageBox)
import msofficemode_rc
from DemoMainWindow import DemoMainWindow
def addMail(model, subject, _from, date, attachment, read, status):
model.insertRow(0)
pm = QPixmap()
model.setData(model.index(0, 0), pm)
if attachment:
pm = QPixmap(":res/attachmentcell.png")
pm.setMask(pm.createMaskFromColor(Qt.magenta))
model.setData(model.index(0, 1), pm)
pm = QPixmap()
model.setData(model.index(0, 2), pm)
if read:
pm = QPixmap(":res/mail.png")
pm.setMask(pm.createMaskFromColor(Qt.magenta))
else:
pm = QPixmap(":res/mailandarrow.png")
pm.setMask(pm.createMaskFromColor(Qt.magenta))
model.setData(model.index(0, 3), pm)
model.setData(model.index(0, 4), date)
model.setData(model.index(0, 5), subject)
model.setData(model.index(0, 6), _from)
if status == 0:
pm = QPixmap(":res/flag.png")
pm.setMask(pm.createMaskFromColor(Qt.magenta))
else:
pm = QPixmap(":res/flag_red.png")
pm.setMask(pm.createMaskFromColor(Qt.magenta))
model.setData(model.index(0, 7), pm)
def createMailModel(parent):
model = QStandardItemModel(0, 8, parent)
model.setHeaderData(0, Qt.Horizontal, model.tr("Importance"))
model.setHeaderData(1, Qt.Horizontal, model.tr("Attachment"))
model.setHeaderData(2, Qt.Horizontal, model.tr("Reminder"))
model.setHeaderData(3, Qt.Horizontal, model.tr("Read"))
model.setHeaderData(4, Qt.Horizontal, model.tr("Created"))
model.setHeaderData(5, Qt.Horizontal, model.tr("Subject"))
model.setHeaderData(6, Qt.Horizontal, model.tr("From"))
model.setHeaderData(7, Qt.Horizontal, model.tr("Status"))
addMail(model, "Happy Year!", "Grace K. <grace@software-inc.com>",
QDateTime(QDate(2015, 12, 31), QTime(17, 3)), False, True, 0)
addMail(model, "Radically concept", "Grace K. <grace@software-inc.com>",
QDateTime(QDate(2014, 12, 22), QTime(9, 44)), True, True, 0)
addMail(model, "Accounts", "pascale@nospam.com",
QDateTime(QDate(2014, 12, 31), QTime(12, 50)), False, True, 0)
addMail(model, "Expenses", "Joe Bloggs <joe@bloggs.com>",
QDateTime(QDate(2014, 12, 25), QTime(11, 39)), False, False, 0)
addMail(model, "Re: Expenses", "Andy <andy@nospam.com>",
QDateTime(QDate(2015, 1, 2), QTime(16, 5)), False, True, 1)
addMail(model, "Re: Accounts", "Joe Bloggs <joe@bloggs.com>",
QDateTime(QDate(2015, 1, 3), QTime(14, 18)), False, False, 0)
addMail(model, "Re: Accounts", "Andy <andy@nospam.com>",
QDateTime(QDate(2015, 1, 3), QTime(14, 26)), True, False, 0)
addMail(model, "Sports", "Linda Smith <linda.smith@nospam.com>",
QDateTime(QDate(2013, 1, 5), QTime(11, 33)), False, True, 1)
addMail(model, "AW: Sports", "Rolf Newschweinstein <rolfn@nospam.com>",
QDateTime(QDate(2014, 1, 5), QTime(12, 0)), True, True, 0)
addMail(model, "RE: Sports", "Petra Schmidt <petras@nospam.com>",
QDateTime(QDate(2015, 1, 5), QTime(12, 1)), False, True, 0)
return model
class Window(DemoMainWindow):
def __init__(self):
DemoMainWindow.__init__(self, "QtitanDataGrid", getGridVersion())
self.setWindowTitle(self.tr("QtitanDataGrid Demo (MS-Office row grouping)"))
self.setGeometry(150, 150, 1000, 600)
Grid.loadTranslation()
self.grid = Grid()
model = createMailModel(self.grid)
# Configure grid view
self.grid.setViewType(Grid.TableView)
view = self.grid.view()
view.options().setModelDecoration(False)
view.options().setRowStyle(GridViewOptions.RowStyleOffice)
# Connect Grid's context menu handler.
self.connect(view, QtCore.SIGNAL("contextMenu(ContextMenuEventArgs*)"), self, QtCore.SLOT("contextMenu(ContextMenuEventArgs* )"))
view.setModel(model)
column = view.getColumnByModelColumnName("Subject")
#Add cell button to the column.
column.addButton(GridColumn.TextButtonIcon, Qtitan.AtBeginning)
self.connect(column, QtCore.SIGNAL("buttonClicked(CellButtonClickEventArgs*)"), self, QtCore.SLOT("cellButtonClicked(CellButtonClickEventArgs*)"))
pm = QPixmap(":res/attachment.png")
pm.setMask(pm.createMaskFromColor(Qt.magenta))
column = view.getColumnByModelColumnName("Attachment")
column.setIcon(pm)
column.setIconApperance(Qtitan.IconOnly)
column.setMaxWidth(20)
column.setMinWidth(20)
column.setTextAlignment(Qt.AlignCenter)
column.setHorSizingEnabled(False)
column.setFilterButtonVisible(False)
column.setEditorType(GridEditor.Picture)
column.editorRepository().setEditable(False)
column.editorRepository().setAlignment(Qt.AlignCenter)
column.editorRepository().setScaled(False)
pm = QPixmap(":res/importance.png")
pm.setMask(pm.createMaskFromColor(Qt.magenta))
column = view.getColumnByModelColumnName("Importance")
column.setIcon(pm)
column.setIconApperance(Qtitan.IconOnly)
column.setMaxWidth(20)
column.setMinWidth(20)
column.setFilterButtonVisible(False)
column.setMenuButtonVisible(False)
column.setTextAlignment(Qt.AlignCenter)
column.setHorSizingEnabled(False)
column.setEditorType(GridEditor.Picture)
column.editorRepository().setEditable(False)
column.editorRepository().setAlignment(Qt.AlignCenter)
column.editorRepository().setScaled(False)
pm = QPixmap(":res/reminder.png")
pm.setMask(pm.createMaskFromColor(Qt.magenta))
column = view.getColumnByModelColumnName("Reminder")
column.setIcon(pm)
column.setIconApperance(Qtitan.IconOnly)
column.setMaxWidth(20)
column.setMinWidth(20)
column.setFilterButtonVisible(False)
column.setMenuButtonVisible(False)
column.setTextAlignment(Qt.AlignCenter)
column.setHorSizingEnabled(False)
column.setEditorType(GridEditor.Picture)
column.editorRepository().setEditable(False)
column.editorRepository().setAlignment(Qt.AlignCenter)
column.editorRepository().setScaled(False)
pm = QPixmap(":res/read.png")
pm.setMask(pm.createMaskFromColor(Qt.magenta))
column = view.getColumnByModelColumnName("Read")
column.setIcon(pm)
column.setIconApperance(Qtitan.IconOnly)
column.setMaxWidth(20)
column.setMinWidth(20)
column.setFilterButtonVisible(False)
column.setMenuButtonVisible(False)
column.setTextAlignment(Qt.AlignCenter)
column.setHorSizingEnabled(False)
column.setEditorType(GridEditor.Picture)
column.editorRepository().setEditable(False)
column.editorRepository().setAlignment(Qt.AlignCenter)
column.editorRepository().setScaled(False)
pm = QPixmap(":res/status.png")
pm.setMask(pm.createMaskFromColor(Qt.magenta))
column = view.getColumnByModelColumnName("Status")
column.setIcon(pm)
column.setIconApperance(Qtitan.IconOnly)
column.setMaxWidth(20)
column.setMinWidth(20)
column.setFilterButtonVisible(False)
column.setMenuButtonVisible(False)
column.setHorSizingEnabled(False)
column.setEditorType(GridEditor.Picture)
column.editorRepository().setEditable(False)
column.editorRepository().setAlignment(Qt.AlignCenter)
column.editorRepository().setScaled(False)
self.setDemoWidget(self.grid, self.createSettingsWidget())
def createSettingsWidget(self):
# Create settings widget
settings = QWidget(self)
l = QVBoxLayout(settings)
l.addLayout(self.createStyleSetting())
autoWidthCheck = QCheckBox(settings)
autoWidthCheck.setText("Column auto width")
self.connect(autoWidthCheck, QtCore.SIGNAL("stateChanged(int)"), self, QtCore.SLOT("autoWidthStateChanged(int)"))
l.addWidget(autoWidthCheck)
autoWidthCheck.setChecked(True)
fastScrollCheck = QCheckBox(settings)
fastScrollCheck.setText("Fast scroll effect")
self.connect(fastScrollCheck, QtCore.SIGNAL("stateChanged(int)"), self, QtCore.SLOT("fastScrollChanged(int)"))
l.addWidget(fastScrollCheck)
fastScrollCheck.setChecked(True)
dottedLineCheck = QCheckBox(settings)
dottedLineCheck.setText("Dotted grid line")
self.connect(dottedLineCheck, QtCore.SIGNAL("stateChanged(int)"), self, QtCore.SLOT("dottedLineChanged(int)"))
l.addWidget(dottedLineCheck)
dottedLineCheck.setChecked(False)
label = QLabel(self)
hl = QHBoxLayout()
label.setText("Grid line style:")
lineStylesSelect = QComboBox(settings)
lineStylesSelect.addItem("None")
lineStylesSelect.addItem("Both")
lineStylesSelect.addItem("Both2D")
lineStylesSelect.addItem("Horizontal")
lineStylesSelect.addItem("Horizontal2D")
lineStylesSelect.addItem("Vertical")
lineStylesSelect.addItem("Vertical2D")
self.connect(lineStylesSelect, QtCore.SIGNAL("currentIndexChanged(int)"), self, QtCore.SLOT("selectGridLineStyles(int)"))
hl.addWidget(label)
hl.addWidget(lineStylesSelect)
l.addLayout(hl)
lineStylesSelect.setCurrentIndex(4)
zoomEnable = QCheckBox(settings)
zoomEnable.setText(self.tr("Zoom enabled"))
zoomEnable.setChecked(True)
self.connect(zoomEnable, QtCore.SIGNAL("stateChanged(int)"), self, QtCore.SLOT("zoomEnabledChanged(int)"))
l.addWidget(zoomEnable)
zoomIndicator = QCheckBox(settings)
zoomIndicator.setText(self.tr("Show zoom indicator"))
zoomIndicator.setChecked(True)
self.connect(zoomIndicator, QtCore.SIGNAL("stateChanged(int)"), self, QtCore.SLOT("zoomIndicatorChanged(int)"))
l.addWidget(zoomIndicator)
zoomSlider = QSlider(settings)
zoomSlider.setOrientation(Qt.Horizontal)
zoomSlider.setTickPosition(QSlider.TicksBothSides)
zoomSlider.setMinimum(25)
zoomSlider.setMaximum(300)
zoomSlider.setTickInterval(25)
zoomSlider.setSingleStep(25)
zoomSlider.setValue(100)
self.connect(zoomSlider, QtCore.SIGNAL("sliderMoved(int)"), self, QtCore.SLOT("zoomValueChanged(int)"))
self.connect(self.grid.view(), QtCore.SIGNAL("zoomChanged(int)"), zoomSlider, QtCore.SLOT("setValue(int)"))
l.addWidget(zoomSlider)
cellAutoRaise = QCheckBox(settings)
cellAutoRaise.setText(self.tr("Auto raise cell button"))
self.connect(cellAutoRaise, QtCore.SIGNAL("stateChanged(int)"), self, QtCore.SLOT("cellButtonAutoRaiseEnabled(int)"))
cellAutoRaise.setChecked(True)
l.addWidget(cellAutoRaise)
frozenRowsBox = QCheckBox(settings)
frozenRowsBox.setText(self.tr("Frozen Rows"))
self.connect(frozenRowsBox, QtCore.SIGNAL("stateChanged(int)"), self, QtCore.SLOT("frozenRowsEnabled(int)"))
frozenRowsBox.setChecked(True)
l.addWidget(frozenRowsBox)
transparentBox = QCheckBox(settings)
transparentBox.setText(self.tr("Transparent Background"))
self.connect(transparentBox, QtCore.SIGNAL("stateChanged(int)"), self, QtCore.SLOT("transparentBackgroundEnabled(int)"))
transparentBox.setChecked(False)
l.addWidget(transparentBox)
printButton = QPushButton(settings)
printButton.setText(self.tr("Print Preview"))
self.connect(printButton, QtCore.SIGNAL("clicked()"), self, QtCore.SLOT("printPreview()"))
l.addWidget(printButton)
return settings
@QtCore.Slot(int)
def autoWidthStateChanged(self, state):
view = self.grid.view()
view.tableOptions().setColumnAutoWidth(Qt.CheckState(state) == Qt.Checked)
@QtCore.Slot(int)
def fastScrollChanged(self, state):
view = self.grid.view()
view.options().setFastScrollEffect(Qt.CheckState(state) == Qt.Checked)
@QtCore.Slot(int)
def dottedLineChanged(self, state):
view = self.grid.view()
pen = view.options().gridLinePen()
if Qt.CheckState(state) == Qt.Checked:
pen.setStyle(Qt.DotLine)
else:
pen.setStyle(Qt.SolidLine)
view.options().setGridLinePen(pen)
@QtCore.Slot(int)
def selectGridLineStyles(self, index):
view = self.grid.view()
if index == 0:
view.options().setGridLines(Qtitan.LinesNone)
elif index == 1:
view.options().setGridLines(Qtitan.LinesBoth)
elif index == 2:
view.options().setGridLines(Qtitan.LinesBoth2D)
elif index == 3:
view.options().setGridLines(Qtitan.LinesHorizontal)
elif index == 4:
view.options().setGridLines(Qtitan.LinesHorizontal2D)
elif index == 5:
view.options().setGridLines(Qtitan.LinesVertical)
elif index == 6:
view.options().setGridLines(Qtitan.LinesVertical2D)
else:
view.options().setGridLines(Qtitan.LinesBoth)
@QtCore.Slot(int)
def zoomEnabledChanged(self, state):
view = self.grid.view()
view.options().setZoomEnabled(Qt.CheckState(state) == Qt.Checked)
@QtCore.Slot(int)
def zoomIndicatorChanged(self, state):
view = self.grid.view()
view.options().setZoomIndicatorActive(Qt.CheckState(state) == Qt.Checked)
@QtCore.Slot(int)
def zoomValueChanged(self, value):
factor = (float(value) / 25) * 25
view = self.grid.view()
view.options().setZoomFactor(factor / 100)
@QtCore.Slot(int)
def cellButtonAutoRaiseEnabled(self, state):
view = self.grid.view()
view.options().setCellButtonAutoRaise(Qt.CheckState(state) == Qt.Checked)
@QtCore.Slot(int)
def frozenRowsEnabled(self, state):
view = self.grid.view()
view.tableOptions().setRowFrozenButtonVisible(Qt.CheckState(state) == Qt.Checked)
view.tableOptions().setFrozenPlaceQuickSelection(Qt.CheckState(state) == Qt.Checked)
@QtCore.Slot(int)
def transparentBackgroundEnabled(self, state):
view = self.grid.view()
view.options().setTransparentBackground(Qt.CheckState(state) == Qt.Checked)
view.options().setAlternatingRowColors(not view.options().alternatingRowColors())
@QtCore.Slot(ContextMenuEventArgs)
def contextMenu(self, args):
args.contextMenu().addAction("Print Preview", self, QtCore.SLOT("printPreview()"))
args.contextMenu().addSeparator()
args.contextMenu().addAction("Developer Machines on the Web", self, QtCore.SLOT("showCompanyWebSite()"))
@QtCore.Slot(CellButtonClickEventArgs)
def cellButtonClicked(self, args):
QMessageBox.information(self, "Cell button clicked",
"Clicked: Button - " + str(args.buttonIndex()) + ", Column Title - " + args.column().caption() + ", RowIndex - " + str(args.row().rowIndex()))
@QtCore.Slot()
def printPreview(self):
self.grid.view().printPreview()
def setShadeColor(self, color):
Grid.themeManager().setShadeColor(color)
if __name__ == "__main__":
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())