#表格中显示 上下文菜单ContextMenu

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class QTableWidgetMenuDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('表格中上下文菜单演示')
        self.resize(500,400)
        self.initUI()
    def initUI(self):
        layout = QVBoxLayout(self)
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(4)
        self.tableWidget.setColumnCount(3)
        self.tableWidget.setHorizontalHeaderLabels(['name','sex','age'])
        layout.addWidget(self.tableWidget)

        item = QTableWidgetItem('tom')
        self.tableWidget.setItem(0,0,item)
        item = QTableWidgetItem('男')
        self.tableWidget.setItem(0, 1, item)
        item = QTableWidgetItem('25')
        self.tableWidget.setItem(0, 2, item)

        self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu)
        self.tableWidget.customContextMenuRequested.connect(self.generateMenu)
    def generateMenu(self,pos): #单击 参数是鼠标点击的位置
        print(pos)
        screenPos = self.tableWidget.mapToGlobal(pos)
        for i in self.tableWidget.selectionModel().selection().indexes():
            rowNo = i.row()
        if rowNo <2:
            menu = QMenu()
            item1 = menu.addAction('menu1')
            item2 = menu.addAction('menu2')
            item3 = menu.addAction('menu3')
            action = menu.exec(screenPos)
            if action == item1:
                print('选择了第一个按钮',self.tableWidget.item(rowNo,0).text(),
                      self.tableWidget.item(rowNo,1).text(),
                      self.tableWidget.item(rowNo,2).text())
            elif action == item2:
                print('选择了第一个按钮',self.tableWidget.item(rowNo,0).text(),
                      self.tableWidget.item(rowNo,1).text(),
                      self.tableWidget.item(rowNo,2).text())
            elif action == item3:
                print('选择了第一个按钮',self.tableWidget.item(rowNo,0).text(),
                      self.tableWidget.item(rowNo,1).text(),
                      self.tableWidget.item(rowNo,2).text())
            else:return

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QTableWidgetMenuDemo()
    main.show()
    sys.exit(app.exec_())

# 树控件 QTreeWidget
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys


class QTableWidgetMenuDemo(QMainWindow):  # 这里用QMainWindow
    def __init__(self, parent=None):
        super(QTableWidgetMenuDemo, self).__init__(parent)
        self.setWindowTitle('表格中上下文菜单演示')
        self.resize(500, 400)
        layout = QVBoxLayout(self)
        self.treeWidget = QTreeWidget() #实例化控件
        self.setCentralWidget(self.treeWidget) #设置为主窗口
        self.treeWidget.setColumnCount(2) #设置2列

        root = QTreeWidgetItem(self.treeWidget) #设置根节点
        root.setText(0,'根节点')
        root.setIcon(0,QIcon('./back.png')) #加图片
        self.treeWidget.setColumnWidth(0,220) #设置宽度

        child1 = QTreeWidgetItem(root) #设置子节点1
        child1.setText(0,'子节点1')
        child1.setText(1,'子节点1的数据')
        child1.setIcon(0,QIcon('./download.png'))
        child1.setCheckState(0,Qt.Checked)

        child2 = QTreeWidgetItem(root) #设置子节点2
        child2.setText(0, '子节点2')
        child2.setText(1, '子节点2的数据')
        child2.setIcon(0, QIcon('./rainbow.png'))
        child2.setCheckState(0, Qt.Checked)

        child3 = QTreeWidgetItem(child2) #为子节点2添加子节点
        child3.setText(0, '子节点3')
        child3.setText(1, '子节点3的数据')
        child3.setIcon(0, QIcon('./rainbow.png'))
        child3.setCheckState(0, Qt.Checked)

        self.treeWidget.expandAll()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QTableWidgetMenuDemo()
    main.show()
    sys.exit(app.exec_())

# 为树节点添加响应事件
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class QTableWidgetMenuDemo(QMainWindow):  # 这里用QMainWindow
    def __init__(self, parent=None):
        super(QTableWidgetMenuDemo, self).__init__(parent)
        self.setWindowTitle('表格中上下文菜单演示')
        self.resize(500, 400)
        layout = QVBoxLayout(self)
        self.treeWidget = QTreeWidget() #实例化控件
        self.treeWidget.setHeaderLabels(['节点','描述'])
        self.setCentralWidget(self.treeWidget) #设置为主窗口
        self.treeWidget.setColumnCount(2) #设置2列

        root = QTreeWidgetItem(self.treeWidget) #设置根节点
        root.setText(0,'根节点')
        root.setIcon(0,QIcon('./back.png')) #加图片
        self.treeWidget.setColumnWidth(0,220) #设置宽度

        child1 = QTreeWidgetItem(root) #设置子节点1
        child1.setText(0,'子节点1')
        child1.setText(1,'子节点1的数据')
        child1.setIcon(0,QIcon('./download.png'))
        child1.setCheckState(0,Qt.Checked)

        self.treeWidget.clicked.connect(self.onTreeClicked)
        self.treeWidget.expandAll()

    def onTreeClicked(self,index):
        item = self.treeWidget.currentItem()
        print(index.row())
        print('key=%s,value=%s' %(item.text(0),item.text(1)))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QTableWidgetMenuDemo()
    main.show()
    sys.exit(app.exec_())

# 为树节点增加编辑和删除
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class QTableWidgetMenuDemo(QWidget):
    def __init__(self, parent=None):
        super(QTableWidgetMenuDemo, self).__init__(parent)
        self.setWindowTitle('表格中上下文菜单演示')
        self.resize(500, 400)
        layout = QVBoxLayout(self)
        self.treeWidget = QTreeWidget() #实例化控件
        self.treeWidget.setHeaderLabels(['节点','描述'])
        self.treeWidget.setColumnCount(2) #设置2列
        root = QTreeWidgetItem(self.treeWidget)
        root.setText(0,'root')
        root.setText(1,'this is root')

        addBtn = QPushButton('add')
        editBtn = QPushButton('Edit')
        deleteBtn = QPushButton('Delete')
        layout.addWidget(addBtn)
        layout.addWidget(editBtn)
        layout.addWidget(deleteBtn)
        layout.addWidget(self.treeWidget)

        addBtn.clicked.connect(self.add)
        editBtn.clicked.connect(self.edit)
        deleteBtn.clicked.connect(self.delete)

        self.treeWidget.clicked.connect(self.onTreeClicked)

    def add(self): #添加
        item = self.treeWidget.currentItem()
        if item:
            node = QTreeWidgetItem(item)
            node.setText(0,'node1')
            node.setText(1,'this is a child')

    def edit(self): #编辑
        item = self.treeWidget.currentItem()
        item.setText(0,'node_edit')
        item.setText(1,'this is an edit node')
    def delete(self): #删除
        item = self.treeWidget.currentItem()
        for item in self.treeWidget.selectedItems():
            if item.parent():#root 父节点 不存在,不能删
                item.parent().removeChild(item)
    def onTreeClicked(self,index):
        item = self.treeWidget.currentItem()
        print(index.row())
        print('key=%s,value=%s'%(item.text(0),item.text(1)))
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QTableWidgetMenuDemo()
    main.show()
    sys.exit(app.exec_())

# 树控件QTreeView
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
if __name__ == '__main__':
    app = QApplication(sys.argv)
    model = QDirModel() #显示文件系统
    tree = QTreeView()
    tree.setModel(model)
    tree.setWindowTitle('QTreeView')
    tree.resize(300,500)
    tree.show()
    sys.exit(app.exec_())

#选项卡控件QTabWidget
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class TabWidgetViewDemo(QTabWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('选项卡控件')
        self.tab1 = QWidget()
        self.tab2 = QWidget()
        self.tab3 = QWidget()

        self.addTab(self.tab1,'选项卡1')
        self.addTab(self.tab2,'选项卡2')
        self.addTab(self.tab3,'选项卡3')

        self.tab1Ui()
        self.tab2Ui()
        self.tab3Ui()
    def tab1Ui(self):
        layout = QFormLayout()
        layout.addRow('name',QLineEdit())
        layout.addRow('age',QLineEdit())
        layout.addRow('sex',QLineEdit())
        self.setTabText(0,'联系方式')
        self.tab1.setLayout(layout)

    def tab2Ui(self):
        layout = QFormLayout()
        sex = QHBoxLayout()
        sex.addWidget(QRadioButton('男'))
        sex.addWidget(QRadioButton('女'))
        layout.addRow(QLabel('sex'),sex)
        layout.addRow('birthday',QLineEdit())
        self.tab2.setLayout(layout)

    def tab3Ui(self):
        layout = QHBoxLayout()
        layout.addWidget(QLabel('科目'))
        layout.addWidget(QCheckBox('语文'))
        layout.addWidget(QCheckBox('数学'))
        layout.addWidget(QCheckBox('英语'))
        self.setTabText(2,'科目')
        self.tab3.setLayout(layout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = TabWidgetViewDemo()
    main.show()
    sys.exit(app.exec_())

#堆栈窗口控件
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class QStackedWidgetDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('堆栈窗口控件')

        self.list = QListWidget() #列表控件
        self.list.insertItem(0,'联系方式')
        self.list.insertItem(1,'个人信息')
        self.list.insertItem(2,'教育程度')

        self.stack1 = QWidget() #列表三个项
        self.stack2 = QWidget()
        self.stack3 = QWidget()

        self.tab1Ui() #每个页设置窗口组成
        self.tab2Ui()
        self.tab3Ui()

        self.stack = QStackedWidget() #堆栈窗口控件
        self.stack.addWidget(self.stack1)
        self.stack.addWidget(self.stack2)
        self.stack.addWidget(self.stack3)

        hbox = QHBoxLayout() #设置水平布局,把列表放左边,堆栈窗口控件放右边
        hbox.addWidget(self.list)
        hbox.addWidget(self.stack)
        self.setLayout(hbox)

        self.list.currentRowChanged.connect(self.display)#设置点击哪一个选项就显示相关内容

    def tab1Ui(self):
        layout = QFormLayout()
        layout.addRow('name',QLineEdit())
        layout.addRow('age',QLineEdit())
        layout.addRow('sex',QLineEdit())
        self.stack1.setLayout(layout)

    def tab2Ui(self):
        layout = QFormLayout()
        sex = QHBoxLayout()
        sex.addWidget(QRadioButton('男'))
        sex.addWidget(QRadioButton('女'))
        layout.addRow(QLabel('sex'),sex)
        layout.addRow('birthday',QLineEdit())
        self.stack2.setLayout(layout)

    def tab3Ui(self):
        layout = QHBoxLayout()
        layout.addWidget(QLabel('科目'))
        layout.addWidget(QCheckBox('语文'))
        layout.addWidget(QCheckBox('数学'))
        layout.addWidget(QCheckBox('英语'))
        self.stack3.setLayout(layout)

    def display(self,index):
        self.stack.setCurrentIndex(index) #根据索引选择堆栈窗口

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QStackedWidgetDemo()
    main.show()
    sys.exit(app.exec_())

#堆栈窗口控件,很强大  QDockWidget
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class QDockWidgetDemo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('停靠控件')
        layout = QHBoxLayout(self)
        self.items = QDockWidget('Dockable',self) #设置可停靠窗口title
        self.listWidget = QListWidget()
        self.listWidget.addItem('item1')
        self.listWidget.addItem('item2')
        self.listWidget.addItem('item3')

        self.items.setWidget(self.listWidget) #停靠控件里添加了一个列表控件QListWidget
        self.setCentralWidget(QLineEdit())
        self.addDockWidget(Qt.RightDockWidgetArea,self.items) #默认靠右停靠
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QDockWidgetDemo()
    main.show()
    sys.exit(app.exec_())
#

#容纳多文档的窗口 【强大】
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class MultiWindowsDemo(QMainWindow):
    count = 0
    def __init__(self):
        super().__init__()
        self.setWindowTitle('容纳多文档的窗口') #重叠 平铺
        self.mdi = QMdiArea() #实例化一个多文档区域对象
        self.setCentralWidget(self.mdi) #设置到主窗口中心区域
        bar = self.menuBar()#设置一个菜单
        file = bar.addMenu('File') #菜单名
        file.addAction('New') #设置动作,新建
        file.addAction('cascade') #层叠
        file.addAction('Tiled') #平铺

        file.triggered.connect(self.windowaction)
    def windowaction(self,q):
        if q.text()=='New':
            MultiWindowsDemo.count +=1
            sub = QMdiSubWindow() #实例化多文档窗口的子窗口对象
            sub.setWidget(QTextEdit()) #子窗口里增加一个多行文本框QTextEdit
            sub.setWindowTitle('子窗口'+str(MultiWindowsDemo.count)) #设置子窗口的标题
            self.mdi.addSubWindow(sub) #添加到主窗口中
            sub.show() #并显示
        elif q.text()=='cascade':
            self.mdi.cascadeSubWindows() #把所有子窗口 层叠显示
        elif q.text()=='Tiled':
            self.mdi.tileSubWindows() #把所有子窗口平铺


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MultiWindowsDemo()
    main.show()
    sys.exit(app.exec_())

posted on 2020-09-01 17:59  94小渣渣  阅读(1731)  评论(0编辑  收藏  举报