#表格中显示 上下文菜单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_())
![pyqt5 获取tableWidget item items pyqt5 获取选树节点索引_子节点](https://s2.51cto.com/images/blog/202403/26052116_6601eacc509cc24875.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
# 树控件 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_())
![pyqt5 获取tableWidget item items pyqt5 获取选树节点索引_Layout_02](https://s2.51cto.com/images/blog/202403/26052116_6601eacc65c1444044.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
# 为树节点添加响应事件
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_())
![pyqt5 获取tableWidget item items pyqt5 获取选树节点索引_控件_03](https://s2.51cto.com/images/blog/202403/26052116_6601eacc8a7e532157.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
# 为树节点增加编辑和删除
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_())
![pyqt5 获取tableWidget item items pyqt5 获取选树节点索引_控件_04](https://s2.51cto.com/images/blog/202403/26052116_6601eacca42d185968.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
# 树控件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_())
![pyqt5 获取tableWidget item items pyqt5 获取选树节点索引_Layout_05](https://s2.51cto.com/images/blog/202403/26052116_6601eaccc253e86264.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
#选项卡控件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_())
![pyqt5 获取tableWidget item items pyqt5 获取选树节点索引_控件_06](https://s2.51cto.com/images/blog/202403/26052116_6601eaccda12d29402.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
#堆栈窗口控件
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_())
![pyqt5 获取tableWidget item items pyqt5 获取选树节点索引_子节点_07](https://s2.51cto.com/images/blog/202403/26052117_6601eacd07d3584585.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
#堆栈窗口控件,很强大 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_())
#
![pyqt5 获取tableWidget item items pyqt5 获取选树节点索引_控件_08](https://s2.51cto.com/images/blog/202403/26052117_6601eacd1f19d7668.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
#容纳多文档的窗口 【强大】
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_())
![pyqt5 获取tableWidget item items pyqt5 获取选树节点索引_Layout_09](https://s2.51cto.com/images/blog/202403/26052117_6601eacd3f29435228.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)