#显示对话框
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtPrintSupport import *
class PrintDialogDemo(QWidget): #这里用QWidget,layout才有效,用QMainWindow无效
    def __init__(self):
        super(PrintDialogDemo,self).__init__()
        self.setGeometry(200,200,550,400)
        self.setWindowTitle('打印对话框')
        self.printer = QPrinter() #首先,实例化一个打印对象
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout(self)
        self.textEdit = QTextEdit(self)

        self.openFileButton = QPushButton('打开文件',self)
        self.openFileButton.clicked.connect(self.openFileButtonClick)

        self.printSettingButton = QPushButton('打印设置',self)
        self.printSettingButton.clicked.connect(self.printSettingButtonClick)

        self.printFileButton = QPushButton('打印文档',self)
        self.printFileButton.clicked.connect(self.pringFileButtonClick)

        layout.addWidget(self.openFileButton)
        layout.addWidget(self.printFileButton)
        layout.addWidget(self.printSettingButton)
        layout.addWidget(self.textEdit)

    def openFileButtonClick(self): #这里的方法名千万不要和按钮重复
        fileDialog = QFileDialog()
        fname = fileDialog.getOpenFileName(self,'open file','./')
        if fname[0]: #getOpenFileName 可以打开多个文件
            with open(fname[0],'r',encoding='utf-8',errors='ignore')as f:
                self.textEdit.setText(f.read())

    def printSettingButtonClick(self):
        pageSetupDialog  =  QPageSetupDialog(self.printer,self)
        pageSetupDialog.exec()

    def pringFileButtonClick(self): #打印文件按钮响应方法
        pirntDialog = QPrintDialog(self.printer,self) #先实例化打印对话框QPrintDialog,传入QPrinter对象参数
        if QDialog.Accepted == pirntDialog.exec():
            self.textEdit.print(self.printer)#textEdit自带print打印方法,传入QPrinter对象作为参数

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

#显示二维表数据 QTableView控件 :首先要有数据源 ,需要创建QTableView实例和数据源(Model)然后关联
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
class QTableViewDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QTableView 演示')
        self.model = QStandardItemModel(4,3)
        self.model.setHorizontalHeaderLabels(['id','name','age'])

        self.tableView = QTableView() #创建QTableView对象
        self.tableView.setModel(self.model) #把Model添加到QTableView对象中

        item1 = QStandardItem('101')
        item2 = QStandardItem('tom')
        item3 = QStandardItem('25')
        self.model.setItem(0,0,item1)
        self.model.setItem(0,1,item2)
        self.model.setItem(0,2,item3)

        layout  = QVBoxLayout(self)
        layout.addWidget(self.tableView)

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

#显示列数据 QListView
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class QListViewDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QListView 演示')
        layout = QVBoxLayout(self)

        listView = QListView()
        listModel = QStringListModel()
        listView.setModel(listModel)

        self.stringList = ['tom','jerry','lucy']
        listModel.setStringList(self.stringList)
        listView.clicked.connect(self.clicked)

        layout.addWidget(listView)
    def clicked(self,item):
        QMessageBox.information(self,'QListView','您选择了:'+self.stringList[item.row()])

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

#扩展的列表控件 QListWidget
from PyQt5.QtWidgets import *
import sys
class QListWidgetDemo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QListWidget 演示')
        self.resize(400,300)
        self.listWidget = QListWidget() #实例化
        self.listWidget.addItem('tom') #添加行内容
        self.listWidget.addItem('lucy')
        self.listWidget.addItem('jerry')
        self.setCentralWidget(self.listWidget)#设置列表控件为整个主窗口的中心位置
        self.listWidget.itemClicked.connect(self.listWidgetClicked) #绑定槽
    def listWidgetClicked(self,index):
        QMessageBox.information(self,'QListWidget','你选择了:'+self.listWidget.item(self.listWidget.row(index)).text())
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QListWidgetDemo()
    main.show()
    sys.exit(app.exec_())

#扩展的表格控件 QTableWidget 与QTableView对应
from PyQt5.QtWidgets import *
import sys
class QTableWidgetDemo(QWidget): #这里又用QWidget了  下面用了layout布局
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QTableWidget 演示')
        self.resize(400,300)
        self.tableWidget = QTableWidget(self)
        self.tableWidget.setRowCount(4)
        self.tableWidget.setColumnCount(3)
        self.tableWidget.setHorizontalHeaderLabels(['姓名','性别','年龄'])
        item1 = QTableWidgetItem('tom')
        item2 = QTableWidgetItem('male')
        item3 = QTableWidgetItem('25')
        self.tableWidget.setItem(0,0,item1)
        self.tableWidget.setItem(0,1,item2)
        self.tableWidget.setItem(0,2,item3)
        layout = QVBoxLayout(self)
        layout.addWidget(self.tableWidget)
        self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)#设置不可以编辑项
        self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)#设置选中整行
        self.tableWidget.resizeColumnsToContents()#设置列宽度按照内容长度适应
        self.tableWidget.verticalHeader().setVisible(False)#取消列头的显示

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

#单元格中放控件 QTableWidget  setCellWidget
from PyQt5.QtWidgets import *
import sys
class QTableWidgetCellDemo(QWidget): #这里又用QWidget了  下面用了layout布局
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QTableWidget 演示')
        self.resize(400,300)
        layout = QVBoxLayout(self)
        self.tableWidget = QTableWidget(self)
        self.tableWidget.setRowCount(4)
        self.tableWidget.setColumnCount(3)
        layout.addWidget(self.tableWidget)
        self.tableWidget.setHorizontalHeaderLabels(['name','age','sex'])
        item1 = QTableWidgetItem('tom')
        self.tableWidget.setItem(0,0,item1)#直接添加文本

        combox = QComboBox()#添加一个下拉框
        combox.addItem('男')
        combox.addItem('女')
        #QSS 样式,类似于html 中CSS
        combox.setStyleSheet('QComboBox{margin:3px}')
        self.tableWidget.setCellWidget(0,1,combox)

        button = QPushButton('修改')#添加一个按钮
        button.setDown(True)
        button.setStyleSheet('QPushButton{margin:3px}')
        self.tableWidget.setCellWidget(0,2,button)

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

# 单元格快速定位到指定行 findItems
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys

class QTableWidgetCellDemo(QWidget):  # 这里又用QWidget了  下面用了layout布局
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QTableWidget 演示')
        self.resize(400, 300)
        layout = QVBoxLayout(self)
        self.tableWidget = QTableWidget(self)
        self.tableWidget.setRowCount(40)
        self.tableWidget.setColumnCount(3)
        layout.addWidget(self.tableWidget)
        self.tableWidget.setHorizontalHeaderLabels(['name', 'age', 'sex'])
        #循环添加内容
        for i in range(40):
            for j in range(3):
                itemContent = f'({i},{j})'
                self.tableWidget.setItem(i,j,QTableWidgetItem(itemContent))
        #搜索
        text = '(12,1)'
        item = self.tableWidget.findItems(text,Qt.MatchExactly)#精确匹配 还可以MatchStartWith 模糊匹配以什么开头
        if len(item)>0:
            item1 = item[0]
            item1.setBackground(QBrush(QColor(0,255,0)))#设置背景色
            item1.setForeground(QBrush(QColor(255,0,0)))#设置前景色
            row = item1.row()
            #定位到指定行
            self.tableWidget.verticalScrollBar().setSliderPosition(row)


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

# 单元格设置字体和颜色
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys

class QTableWidgetCellDemo(QWidget):  # 这里又用QWidget了  下面用了layout布局
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QTableWidget 演示')
        self.resize(400, 300)
        layout = QVBoxLayout(self)
        self.tableWidget = QTableWidget(self)
        self.tableWidget.setRowCount(40)
        self.tableWidget.setColumnCount(3)
        layout.addWidget(self.tableWidget)
        self.tableWidget.setHorizontalHeaderLabels(['name', 'age', 'sex'])

        item1 = QTableWidgetItem('tom')
        item1.setFont(QFont('Times',14,QFont.Black))
        item1.setForeground(QBrush(QColor(255,0,0)))
        self.tableWidget.setItem(0,0,item1)

        item2 = QTableWidgetItem('25')
        item2.setBackground(QBrush(QColor(0,0,255)))
        item2.setForeground(QBrush(QColor(255,255,0)))
        self.tableWidget.setItem(0,1,item2)

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

# 单元格排序
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys

class QTableWidgetCellDemo(QWidget):  # 这里又用QWidget了  下面用了layout布局
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QTableWidget 演示')
        self.resize(400, 300)
        layout = QVBoxLayout(self)
        self.tableWidget = QTableWidget(self)
        self.tableWidget.setRowCount(40)
        self.tableWidget.setColumnCount(3)
        layout.addWidget(self.tableWidget)
        self.tableWidget.setHorizontalHeaderLabels(['name', 'age', 'sex'])

        item1 = QTableWidgetItem('tom')
        item2 = QTableWidgetItem('25')
        item3 = QTableWidgetItem('男')
        self.tableWidget.setItem(0,0,item1)
        self.tableWidget.setItem(0,1,item2)
        self.tableWidget.setItem(0,2,item3)
        item1 = QTableWidgetItem('jerry')
        item2 = QTableWidgetItem('22')
        item3 = QTableWidgetItem('男')
        self.tableWidget.setItem(1, 0, item1)
        self.tableWidget.setItem(1, 1, item2)
        self.tableWidget.setItem(1, 2, item3)
        item1 = QTableWidgetItem('lucy')
        item2 = QTableWidgetItem('20')
        item3 = QTableWidgetItem('女')
        self.tableWidget.setItem(2, 0, item1)
        self.tableWidget.setItem(2, 1, item2)
        self.tableWidget.setItem(2, 2, item3)

        button = QPushButton('按年龄排序')
        button.clicked.connect(self.order)
        self.orderType = Qt.DescendingOrder #定义一个顺序类型变量
        layout.addWidget(button)
    def order(self):
        if self.orderType == Qt.DescendingOrder:#如果是降序,就改成升序,否则改成降序
            self.orderType = Qt.AscendingOrder
        else:
            self.orderType = Qt.DescendingOrder
        self.tableWidget.sortItems(1,self.orderType)#把变量用在控件的第2个列

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

# 单元格设置文本对齐方式 setTextAlignment  Qt.AlignRight  Qt.AlignLeft
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys

class QTableWidgetCellDemo(QWidget):  # 这里又用QWidget了  下面用了layout布局
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QTableWidget 演示')
        self.resize(400, 300)
        layout = QVBoxLayout(self)
        self.tableWidget = QTableWidget(self)
        self.tableWidget.setRowCount(10)
        self.tableWidget.setColumnCount(3)
        layout.addWidget(self.tableWidget)
        self.tableWidget.setHorizontalHeaderLabels(['name', 'age', 'sex'])

        item1 = QTableWidgetItem('tom')
        item1.setTextAlignment(Qt.AlignRight | Qt.AlignBottom)
        item2 = QTableWidgetItem('25')
        item2.setTextAlignment(Qt.AlignHCenter|Qt.AlignVCenter)
        item3 = QTableWidgetItem('男')
        item3.setTextAlignment(Qt.AlignLeft | Qt.AlignTop)
        self.tableWidget.setItem(0,0,item1)
        self.tableWidget.setItem(0,1,item2)
        self.tableWidget.setItem(0,2,item3)

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

# 单元格合并 setSpan(row,col,要合并的行数,要合并的列数),设置单元格尺寸,图文混排,改变图片尺寸
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys

class QTableWidgetCellDemo(QWidget):  # 这里又用QWidget了  下面用了layout布局
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QTableWidget 演示')
        self.resize(400, 300)
        layout = QVBoxLayout(self)
        self.tableWidget = QTableWidget(self)
        self.tableWidget.setRowCount(10)
        self.tableWidget.setColumnCount(4)
        layout.addWidget(self.tableWidget)
        self.tableWidget.setHorizontalHeaderLabels(['name', 'age', 'sex','image'])

        item1 = QTableWidgetItem('tom')
        item2 = QTableWidgetItem('25')
        item3 = QTableWidgetItem('男')
        self.tableWidget.setItem(0,0,item1)
        self.tableWidget.setSpan(0,0,3,1) #合并
        self.tableWidget.setSpan(0,1,1,2) #合并
        self.tableWidget.setRowHeight(1,50) #第二行行高50
        self.tableWidget.setColumnWidth(2,40)#第三列列宽40
        self.tableWidget.setItem(0,1,item2)
        self.tableWidget.setItem(0,2,item3)

        item4 = QTableWidgetItem(QIcon('./favicon.ico'),'image')#第四列是一个图片
        self.tableWidget.setItem(0,3,item4)

        item1 = QTableWidgetItem('tom')
        item2 = QTableWidgetItem('25')
        item3 = QTableWidgetItem('男')
        item4 = QTableWidgetItem()
        self.tableWidget.setItem(1,0,item1)
        self.tableWidget.setItem(1,1,item2)
        self.tableWidget.setItem(1,2,item3)
        self.tableWidget.setItem(1,3,item4)
        item4 = QTableWidgetItem(QIcon('./favicon.ico'), 'image')  # 第四列是一个图片

        self.tableWidget.setItem(1, 3, item4)

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

posted on 2020-08-31 18:13  94小渣渣  阅读(815)  评论(0编辑  收藏  举报