first try
This commit is contained in:
36
dictlist.py
Normal file
36
dictlist.py
Normal file
@ -0,0 +1,36 @@
|
||||
from PyQt5.QtWidgets import QListWidget, QListWidgetItem
|
||||
|
||||
|
||||
class DictList(QListWidget):
|
||||
|
||||
def __init__(self, data, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.data = {}
|
||||
self.update(data)
|
||||
|
||||
def update(self, data):
|
||||
for k, v in data.items():
|
||||
self.add(k, v)
|
||||
|
||||
def add(self, key, value):
|
||||
if key not in self.data:
|
||||
itm = QListWidgetItem(key)
|
||||
self.addItem(itm)
|
||||
self.data[key] = value
|
||||
|
||||
def get(self, index):
|
||||
key = self.get_key(index)
|
||||
value = self.data[key]
|
||||
return key, value
|
||||
|
||||
def get_value(self, index):
|
||||
_key, value = self.get(index)
|
||||
return value
|
||||
|
||||
def get_key(self, index): # this relies on dict being ordered
|
||||
lst = list(self.data)
|
||||
row = index.row()
|
||||
return lst[row]
|
||||
|
||||
|
||||
|
14
grum.py
Executable file
14
grum.py
Executable file
@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
from PyQt5.QtWidgets import QApplication
|
||||
from mainwin import MainWindow
|
||||
|
||||
|
||||
app = QApplication(sys.argv)
|
||||
mw = MainWindow()
|
||||
mw.show()
|
||||
sys.exit(app.exec())
|
||||
|
||||
|
||||
|
47
mainwin.py
Normal file
47
mainwin.py
Normal file
@ -0,0 +1,47 @@
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtWidgets import QMainWindow, QSplitter
|
||||
|
||||
from dictlist import DictList
|
||||
from mdi import MDIArea, MDISubWindow
|
||||
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
|
||||
def __init__(self, title="grum.py", *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.setWindowTitle(title)
|
||||
|
||||
data = {"a": 10, "b": 20, "c": 30, "d": 40}
|
||||
self.lst = lst = DictList(data)
|
||||
lst.setAlternatingRowColors(True)
|
||||
lst.doubleClicked.connect(self.on_select_list_item)
|
||||
self.setCentralWidget(lst)
|
||||
|
||||
bar = self.menuBar()
|
||||
self.mdi = mdi = MDIArea(bar)
|
||||
|
||||
splitter = QSplitter(Qt.Horizontal)
|
||||
splitter.addWidget(lst)
|
||||
splitter.addWidget(mdi)
|
||||
splitter.setSizes([100, 1000])
|
||||
|
||||
self.setCentralWidget(splitter)
|
||||
|
||||
|
||||
def on_select_list_item(self, index):
|
||||
key, value = self.lst.get(index)
|
||||
|
||||
#TODO: just a test for dynamic adding
|
||||
self.lst.add("x", 100)
|
||||
|
||||
for sub in self.mdi.subWindowList():
|
||||
if sub.windowTitle() == key:
|
||||
self.mdi.setActiveSubWindow(sub)
|
||||
return
|
||||
|
||||
sub = MDISubWindow(key, value)
|
||||
self.mdi.addSubWindow(sub)
|
||||
sub.show()
|
||||
|
||||
|
||||
|
35
mdi.py
Normal file
35
mdi.py
Normal file
@ -0,0 +1,35 @@
|
||||
from PyQt5.QtWidgets import QMdiArea, QMdiSubWindow, QAction
|
||||
from PyQt5.QtWidgets import QTextEdit
|
||||
|
||||
|
||||
class MDIArea(QMdiArea):
|
||||
|
||||
def __init__(self, bar, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
menu = bar.addMenu("View")
|
||||
menu.addAction("Cascade")
|
||||
menu.addAction("Tiled")
|
||||
menu.triggered[QAction].connect(self.on_menu_select)
|
||||
|
||||
|
||||
def on_menu_select(self, p):
|
||||
txt = p.text()
|
||||
if txt == "Cascade":
|
||||
self.cascadeSubWindows()
|
||||
elif txt == "Tiled":
|
||||
self.tileSubWindows()
|
||||
|
||||
|
||||
|
||||
class MDISubWindow(QMdiSubWindow):
|
||||
|
||||
def __init__(self, title, data, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.setWindowTitle(title)
|
||||
|
||||
txt = QTextEdit(str(data))
|
||||
self.setWidget(txt)
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user