Qt自定义委托在QTableView中绘制控件、图片、文字
QtableWidget的用法总结
QtableWidget的用法总结QTableWidget的主要特点和用途包括:1. 显示数据:通过设置表头和数据项,可以方便地显示数据。
可以使用setItem方法设置每个单元格的内容,也可以使用setRow或setColumn方法批量设置行或列的内容。
3. 排序和过滤:可以通过sortByColumn方法和setSortingEnabled 属性来设置表格的排序方式,默认情况下,表格是可排序的。
可以使用setFilterRegExp方法和setFilterKeyColumn方法来实现表格的过滤功能。
4. 选择和选中:可以通过setSelectionMode方法来设置表格的选择方式,默认情况下,可以选择单行或单列。
可以使用selectedItems方法获取当前选中的单元格。
5. 高级功能:QTableWidget还提供了很多高级功能,包括合并单元格,拖放操作,剪贴板操作,自定义样式,自定义委托等。
可以通过继承QTableWidget类来实现自定义的表格功能。
接下来,我们将对QTableWidget的常用功能进行详细介绍和示例。
1. 创建QTableWidget可以使用以下代码来创建一个简单的QTableWidget:"""import sysfrom PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItemclass MyWindow(QMainWindow):def __init__(self):super(.__init__self.initUIdef initUI(self):self.tableWidget = QTableWidget(self)self.tableWidget.setRowCount(5)self.tableWidget.setColumnCount(3)self.setCentralWidget(self.tableWidget)self.showapp = QApplication(sys.argv)window = MyWindowsys.exit(app.exec_()"""2.设置表头可以使用setHorizontalHeaderLabels和setVerticalHeaderLabels 方法来设置表头:"""self.tableWidget.setHorizontalHeaderLabels(['姓名', '年龄','性别'])self.tableWidget.setVerticalHeaderLabels(['1', '2', '3', '4', '5'])"""3.设置单元格内容可以使用setItem方法来设置每个单元格的内容:"""item = QTableWidgetItem('李四')self.tableWidget.setItem(0, 0, item)"""4.获取单元格内容可以使用item方法来获取每个单元格的内容:"""item = self.tableWidget.item(0, 0)print(item.text()""""""self.tableWidget.setEditTriggers(QTableWidget.AnyKeyPressed ,QTableWidget.EditKeyPressed , QTableWidget.DoubleClicked) """6.排序和过滤可以使用sortByColumn方法和setSortingEnabled属性来设置表格的排序方式:"""self.tableWidget.setSortingEnabled(True)self.tableWidget.sortByColumn(1, QtCore.Qt.AscendingOrder)"""可以使用setFilterRegExp方法和setFilterKeyColumn方法来实现表格的过滤功能:"""filter_str = '李'self.tableWidget.setFilterRegExp(QtCore.QRegExp(filter_str, QtCore.Qt.CaseInsensitive))self.tableWidget.setFilterKeyColumn(0)"""7.选择和选中可以使用setSelectionMode方法来设置表格的选择方式,默认情况下,可以选择单行或单列:"""self.tableWidget.setSelectionMode(QTableWidget.SingleSelecti on)self.tableWidget.setSelectionBehavior(QTableWidget.SelectRow s)"""可以使用selectedItems方法获取当前选中的单元格:"""selected_items = self.tableWidget.selectedItemsfor item in selected_items:print(item.text()"""8.高级功能合并单元格:"""self.tableWidget.setSpan(0, 0, 2, 2)"""拖放操作:"""self.tableWidget.setDragDropMode(QTableWidget.DragDrop)self.tableWidget.setAcceptDrops(True)"""剪贴板操作:"""self.tableWidget.setContextMenuPolicy(QtCore.Qt.ActionsConte xtMenu)copy_action = QtGui.QAction('拷贝', self)copy_action.triggered.connect(self.copy)self.addAction(copy_action)"""自定义样式:"""self.tableWidget.setStyleSheet("QTableWidget{background-color: yellow}")"""自定义委托:"""self.tableWidget.setItemDelegate(MyDelegate() """。
delegate qsyleitemdelegateqt 例子
delegate qsyleitemdelegateqt 例子QStyledItemDelegate是Qt 框架中的一个类,用于自定义表格视图(如QTableView)的单元格的渲染和编辑。
它提供了一种灵活的方式来定制单元格的外观和行为。
下面是一个简单的例子,展示了如何使用QStyledItemDelegate来定制QTableView中的单元格样式:1.创建项目:首先,创建一个新的Qt Widgets Application 项目。
2.定义模型:为了在QTableView中显示数据,你需要一个模型。
这里我们使用QStandardItemModel。
3.创建委托:创建一个继承自QStyledItemDelegate的类,并重写paint()方法来定制单元格的外观。
4.设置委托:将创建的委托实例设置到QTableView的某个列上。
以下是一个简化的代码示例:mainwindow.hcpp#ifndef MAINWINDOW_H#define MAINWINDOW_H#include<QMainWindow>#include<QStyledItemDelegate>#include<QStandardItemModel>class MyDelegate : public QStyledItemDelegate {public:MyDelegate(QObject *parent = nullptr) :QStyledItemDelegate(parent) {}void paint(QPainter *painter, const QStyleOptionViewItem&option, const QModelIndex &index)const override;};class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);void setupModelAndView();};#endif// MAINWINDOW_Hmainwindow.cppcpp#include"mainwindow.h"#include<QApplication>#include<QTableView>#include<QVBoxLayout>void MyDelegate::paint(QPainter *painter, constQStyleOptionViewItem &option, const QModelIndex &index)const { // 自定义绘制逻辑,例如设置文本颜色、背景色等}MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QWidget *centralWidget = new QWidget;setCentralWidget(centralWidget);QVBoxLayout *layout = new QVBoxLayout(centralWidget);QStandardItemModel *model = new QStandardItemModel();QTableView *tableView = new QTableView;layout->addWidget(tableView);setupModelAndView();}void MainWindow::setupModelAndView() {// 填充模型数据QStandardItemModel *model = new QStandardItemModel();QTableView *tableView = new QTableView;tableView->setModel(model);// 设置委托到某个列上,例如第一列(列索引从0开始)MyDelegate *delegate = new MyDelegate(tableView);tableView->setItemDelegateForColumn(0, delegate);}在这个例子中,我们创建了一个自定义的委托类MyDelegate,并重写了paint()方法来定制单元格的外观。
Qt中QTableWidget用法总结
Qt中QTableWidget用法总结一、创建QTableWidget要创建一个QTableWidget,首先需要在Qt项目中添加表格控件的头文件:#include <QTableWidget>然后通过创建一个QTableWidget类的实例来生成一个表格:QTableWidget *tableWidget = new QTableWidget(;二、设置表格属性可以通过以下几种方式来设置表格的属性:1.设置表格的行数和列数:tableWidget->setRowCount(5);tableWidget->setColumnCount(3);tableWidget->setHorizontalHeaderLabels(QStringList( << "Name" << "Age" << "Gender");3.设置单元格的属性:tableWidget->setItem(row, column, item):设置特定单元格的内容。
tableWidget->item(row, column)->setTextAlignment(Qt::AlignCenter):设置单元格的对齐方式。
4.设置表格的选择模式:tableWidget->setSelectionMode(QAbstractItemView::SingleSelection):设置为单选模式。
tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection):设置为多选模式。
三、添加数据可以通过以下几种方式向表格中添加数据:1.直接设置单元格中的文字:tableWidget->setItem(row, column, newQTableWidgetItem("John"));2.设置单元格中的图标:QTableWidgetItem *item = new QTableWidgetItem(;item->setIcon(QIcon("icon.png"));tableWidget->setItem(row, column, item);3.添加整行或整列的数据:tableWidget->setHorizontalHeaderLabels(QStringList( << "Name" << "Age" << "Gender");tableWidget->insertRow(row);tableWidget->setItem(row, 0, new QTableWidgetItem("John"));tableWidget->setItem(row, 1, new QTableWidgetItem("25"));tableWidget->setItem(row, 2, new QTableWidgetItem("Male"));四、信号与槽的连接可以通过以下几种方式连接信号与槽:1.单元格点击事件:connect(tableWidget, &QTableWidget::cellClicked, this,&MainWindow::onCellClicked);2.行选中事件:connect(tableWidget, &QTableWidget::itemSelectionChanged, this, &MainWindow::onSelectionChanged);3.表格数据变化事件:connect(tableWidget, &QTableWidget::itemChanged, this,&MainWindow::onItemChanged);五、其他常用功能1.获取选中的单元格:QList<QTableWidgetItem *> selectedItems = tableWidget->selectedItems(;2.获取单元格中的数据:QString text = tableWidget->item(row, column)->text(;3.设置单元格的背景色:tableWidget->item(row, column)->setBackground(Qt::blue);4.设置选中行的背景色:tableWidget->setStyleSheet("QTableWidget::item:selected{background-color: blue}");5.设置表头的背景色:tableWidget->horizontalHeader(->setStyleSheet("QHeaderView::section{background-color: gray}");六、总结。
pyqt实现在Widgets中显示图片和文字的方法
pyqt实现在Widgets中显⽰图⽚和⽂字的⽅法思路⾮常简单:<p>创建window,设置窗⼝⼤⼩,创建label1,导⼊图⽚,创建label2,导⼊⽂字,show,结束!</p> import sysfrom PyQt5 import QtWidgets,QtGui#定义窗⼝函数windowdef window():#我事实上不太明⽩⼲嘛要这⼀句话,只是pyqt窗⼝的建⽴都必须调⽤QApplication⽅法app=QtWidgets.QApplication(sys.argv)#新建⼀个窗⼝,名字叫做ww=QtWidgets.QWidget()#定义w的⼤⼩w.setGeometry(100,100,300,200)#给w⼀个Titlew.setWindowTitle('lesson 2')#在窗⼝w中,新建⼀个lable,名字叫做l1l1=QtWidgets.QLabel(w)#调⽤QtGui.QPixmap⽅法,打开⼀个图⽚,存放在变量png中png=QtGui.QPixmap('/home/capture/Pictures/Selection_026.png')# 在l1⾥⾯,调⽤setPixmap命令,建⽴⼀个图像存放框,并将之前的图像png存放在这个框框⾥。
l1.setPixmap(png)#在窗⼝w中,新建另⼀个label,名字叫做l2l2=QtWidgets.QLabel(w)#⽤open⽅法打开⼀个⽂本⽂件,并且调⽤read命令,将其内容读⼊到file_text中file=open('/home/capture/eric6_test/auto_k2_all/test1.log')file_text=file.read()#调⽤setText命令,在l2中显⽰刚才的内容l2.setText(file_text)#调整l1和l2的位置l1.move(100,20)l2.move(140,120)#显⽰整个窗⼝w.show()#退出整个appapp.exit(app.exec_())#调⽤window这个函数window()不过,这样写的⽬的是什么,弄⼀个函数,来⽣成⼀个图像,没有参数可以输⼊?还不如不⽤函数呢。
Qt自定义委托在QTableView中绘制控件、图片、文字
2、实现在 QTableView 中绘制进度条
Cpp 代码
1. //重载绘制函数 2. void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &o ption, 3. 4. { 5. 6. 7. 8. 9. 10. oInt(); 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. //进度条的风格选项 QStyleOptionProgressBarV2 *progressBarOption = new QStyleOptionPro gressBarV2(); progressBarOption->rect = option.rect; progressBarOption->minimum = 0; progressBarOption->maximum = subTaskNum; progressBarOption->progress = finishedSubTaskNum; int t = finishedSubTaskNum/subTaskNum; progressBarOption->text = QString::number(t) + "%"; int subTaskNum = itemModel->data(itemModel->index(index.row(), 8), Qt::DisplayRole).toInt(); //如果是'已经完成子任务数' if (index.column() == 9) { const QAbstractItemModel *itemModel = index.model(); //获得索引对应 Model 中的数据 int finishedSubTaskNum = itemModel->data(index, Qt::DisplayRole).t const QModelIndex &index) const
QT实现在QLabel上画图
QT实现在QLabel上画图QT之所以不能再任意控件上绘图是因为QT的事件过滤器把控件的绘图事件给过滤了。
在paintevent()函数中,通常需要设置QPainter对象,创建QPainter对象的同时需要指定绘图设备,即继承⾃QPainterDevice的⼦类作为绘图设备,绘制出来的图形将在这个设备上进⾏显⽰,Qt⼀共提供了4个这样的类,分别是QPixmap,QBitmap,QImage,和QPicture。
在控件上绘图⼜应该怎么办呢,我这以QLabel为例:使⽤事件过滤器来使QLabel对象捕获QEvent::Paint事件。
即,绘图函数不需要放在paintevent()函数中也可以实现绘图。
实现这个功能的主要函数就还是事件过滤器的两个重要函数,即installEventFilter()和eventFileter()#include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);ui->label->installEventFilter(this); //这⾏不能省}Widget::~Widget(){delete ui;}bool Widget::eventFilter(QObject *watched, QEvent *event) //⽤过滤器eventFilter()拦截QLabel中的QEvent::Paint事件{if(watched ==ui->label && event->type() == QEvent::Paint)paint();return QWidget::eventFilter(watched,event);}void Widget::paint() //绘图{QPainter painter(ui->label);painter.setPen(Qt::blue);// painter.drawLine(100,100,200,200);painter.drawEllipse(30,15,50,65);painter.drawLine(0,100,111,100);}我在ui⾥添加了QLabel控件命名label,并且⽤样式表将label的背景变成⿊⾊⽅便观察,下⾯是效果图。
Qt编写的项目作品22-自定义委托全家桶
Qt编写的项⽬作品22-⾃定义委托全家桶⼀、功能特点1. 可设置多种委托类型,例如复选框/⽂本框/下拉框/⽇期框/微调框/进度条等。
2. 可设置是否密⽂显⽰,⼀般⽤于⽂本框。
3. 可设置是否允许编辑,⼀般⽤于下拉框。
4. 可设置是否禁⽤,⼀般⽤来禁⽤某列。
5. 可设置数据集合,⽐如下拉框数据集合。
6. 提供值变化信号,⽐⽅说下拉框值改动触发。
7. 可设置数据校验⾃动产⽣不同的图标。
8. ⽀持设置校验列/校验规则/校验值/校验成功图标/校验失败图标/图标⼤⼩。
9. 可设置校验数据产⽣不同的背景颜⾊和⽂字颜⾊。
10. 校验规则⽀持 == > >= < <= != contain,⾮常丰富。
11. 复选框⾃动居中⽽不是左侧,切换选中状态发送对应的信号。
12. 可设置颜⾊委托,⾃动根据颜⾊值绘制背景颜⾊,⾃动设置最佳⽂本颜⾊。
13. 可设置按钮委托,⾃动根据值⽣成多个按钮,按钮按下发送对应的信号。
14. 当设置了委托列时⾃动绘制选中背景⾊和⽂字颜⾊。
15. 可设置关键字对照表绘制关键字⽐如原始数据是 0-禁⽤ 1-启⽤。
16. 可设置复选框对应的映射选中不选中关键字。
17. 根据不同的委托类型绘制,可以依葫芦画瓢⾃⾏增加⾃⼰的委托。
18. 所有功能封装成1个类不到500⾏代码,使⽤极其⽅便友好。
需求应⽤场景:1. 某个字段需要提供下拉框进⾏选择,下拉框可选是否允许编辑。
2. 某个字段需要提供密码框进⾏输⼊,密⽂显⽰字段值。
3. 某个字段需要提供⽇期框下拉选择⽇期时间。
4. 某个字段需要提供微调框设定值。
5. 某个字段需要提供进度条显⽰字段值。
6. 某个字段列需要禁⽤。
7. 各种委托控件可以设置初始的数据集合,⽐如下拉框。
8. 各种委托控件在值发⽣变化的时候发出valuechanged信号,⽐如下拉框选择声⾳⽂件的时候进⾏播放试听,微调框值改变的时候联动其他控件进⾏处理等。
9. 某个字段根据设定的规则进⾏数据校验⾃动产⽣不同的图标显⽰,⽐如报警红⾊图标/正常绿⾊图标,⼀⽬了然。
qt tablewidget用法
qt tablewidget用法QT是一款广泛使用的跨平台C++图形用户界面库,而TableWidget是QT框架中的一个重要组件,常用于显示和处理表格数据。
本文将详细介绍TableWidget的基本用法,包括创建、设置、编辑和显示表格数据等操作。
TableWidget是QT框架中用于显示表格数据的控件,它提供了丰富的功能和属性,可以方便地创建和管理表格。
TableWidget支持多种数据类型,如整数、浮点数、字符串等,并且可以自定义单元格的样式和布局。
要使用TableWidget,首先需要在QT项目中引入相关的库文件,并创建一个TableWidget对象。
可以通过代码或QtDesigner工具来创建TableWidget。
1.代码创建:```cppQTableWidget*tableWidget=newQTableWidget(parent);```其中,parent表示父窗口或控件对象。
2.QtDesigner创建:在QtDesigner工具中,通过拖放方式创建一个TableWidget控件,并设置其属性。
使用TableWidget之前,需要向其中添加行和列,并设置单元格的数据。
可以使用appendRow()和appendColumn()方法来添加行和列,使用setItem()方法来设置单元格的数据。
1.添加行和列:QTableWidgetItem*item1=newQTableWidgetItem(QString("Colum n1"));QTableWidgetItem*item2=newQTableWidgetItem(QString("Colum n2"));tableWidget->appendRow(QStringList(item1,item2));```2.设置单元格数据:```cpptableWidget->setItem(row,col,newQTableWidgetItem(QString("Data%1").arg(ro w*col)));```其中,row表示行号,col表示列号。
(4):QTabWidget控件
(4):QTabWidget控件⼀.说明:1.该组件是⼀个可切换⾯板的组件,主要提供⾯板重叠,达到节省空间的⽬的。
2.通常会隐藏标签,只提供pane供显⽰。
3.主要组成部分:标签(tab-bar):即点击进⾏切换的⼩按钮⾯板(pane):即装载被添加组件的容器,是显⽰内容的容器。
4.组件的QSS样式设置,主要是选择器:QTabWidget/QTabWidget::pane/QTabBar::tab/QTabWidget::tab-barQTabWidget {background: #16181c;border: none;margin-right: 5px;}QTabWidget::pane {background: #16181c;border-top: 1px solid #B82525;padding-top: 10px;}QTabBar::tab{margin-left: 25px;width: 70px;padding: 10px;color: gray;font-size: 13px;font-weight: bold;background: #16181c;}QTabBar::tab:hover{color: #DCDDE4;}QTabBar::tab:selected{background: #B82525;color: #DCDDE4;}QTabWidget::tab-bar{alignment: right;}⼆.主要函数:属性:58 properties inherited from QWidget1 property inherited from QObject公有函数:可重载公共函数:220 public functions inherited from QWidget29 public functions inherited from QObject12 public functions inherited from QPaintDevice 公共槽:19 public slots inherited from QWidget1 public slot inherited from QObject Signals1 signal inherited from QWidget1 signal inherited from QObject保护成员函数:可重载保护成员函数:37 protected functions inherited from QWidget8 protected functions inherited from QObject1 protected function inherited from QPaintDevice Additional Inherited Members4 static public members inherited from QWidget7 static public members inherited from QObject1 protected slot inherited from QWidget。
Qt自定义QTabWidget
Qt⾃定义QTabWidget思路:QTabWidget的特点:点击不同的选项卡显⽰不同的窗⼝。
可以将QTabWidget分成两部分: (1).选项卡:点击时要知道点击的是哪个选项。
则需要将选项卡和窗⼝的信息存起来,点击时去这个信息中判断; (2).窗⼝:点击某个选项卡时,相应的窗⼝显⽰,其他窗⼝隐藏,可以将这些窗⼝全部放到⼀个布局中。
(1)创建⼀个结构体,包含选项卡和窗⼝的信息:struct TabWidgetItem { QString id; //每项的id QWidget* window; //窗⼝ IconButton* icon; //选项卡 int status; //0选中; 1选中};QList<TabWidgetItem*> m_pTabWidgetList; //存放整个TabWidget(选项卡和窗⼝所有信息)信息的list列表(2)初始化布局和结构体void TabWidget::initLayout(){ QHBoxLayout* pMainLayout = new QHBoxLayout(this); pMainLayout->setMargin(1); pMainLayout->setSpacing(10); QVBoxLayout* pIconLayout = new QVBoxLayout(); QVBoxLayout* pWindowLayout = new QVBoxLayout(); pMainLayout->addLayout(pWindowLayout); pMainLayout->addLayout(pIconLayout);}void TabWidget::initTabWidgetItemData(){ { TabWidgetItem* pItem = new TabWidgetItem; pItem->id = "real"; QWidget* pBaseWidget = new QWidget(this); pItem->window = pBaseWidget; pItem->window->setVisible(false); pWindowLayout->addWidget(pItem->window);pItem->icon = new IconButton("实时视频", this);pIconLayout->addWidget(pItem->icon);connect(pItem->icon, SIGNAL(clicked(IconButton*)), this, SLOT(sltMenuClicked(IconButton*)));pItem->status = false;m_pTabWidgetList.append(pItem); } { TabWidgetItem* pItem = new TabWidgetItem; pItem->id = "local"; QWidget* pBaseWidget = new QWidget(this); pItem->window = pBaseWidget; pItem->window->setVisible(false); pWindowLayout->addWidget(pItem->window);pItem->icon = new IconButton("本地回放", this);pIconLayout->addWidget(pItem->icon);connect(pItem->icon, SIGNAL(clicked(IconButton*)), this, SLOT(sltMenuClicked(IconButton*)));pItem->status = false;m_pTabWidgetList.append(pItem); }}(3)⾃定义选项卡IconButton类IconButton.h⽂件#pragma once#include <QWidget>class IconButton: public QWidget{Q_OBJECTpublic:explicit IconButton(QString title, QWidget *parent = 0);~IconButton();private:QLabel* m_pTitle;private:void initLayout();public:void setTitle(QString title);protected:void mouseReleaseEvent(QMouseEvent *event);signals:void clicked();signals:void clicked(IconButton*);}IconButton.cpp⽂件#include "IconButton.h"IconButton::IconButton(QString title, QWidget *parent): QWidget(parent){initLayout();setTitle(title);}void IconButton::initLayout(){m_pMainLayout = new QHBoxLayout(this);m_pTitle = new QLabel(this);m_pTitle->setStyleSheet("QLabel{font-size:15px;font-weight:100;color:white;}"); m_pMainLayout->addWidget(m_pTitle, 0, Qt::AlignLeft);}void IconButton::setTitle(QString title){m_pTitle->setText(title);}void IconButton::mouseReleaseEvent(QMouseEvent *event){if (Qt::LeftButton == event->button()){/*只处理⿏标在按钮区域弹起 */if (this->rect().contains(event->pos())){/*单击*/emit clicked();emit clicked(this); //关键:单击返回this指针}}}(4)设置切换函数void TabWidget::setTabWidgetActivePage(QString id){QWidget* pNextwindow = NULL;for (int i = 0; i < m_pTabWidgetList.size(); i++) { //先将所有窗⼝隐藏TabWidgetItem* item = m_pTabWidgetList.at(i);item->status = 0;item->icon->setChekced(false);item->window->hide();if (item->id == id) {item->status = 1;item->icon->setChekced(true);pNextwindow = item->window;}}if (pNextwindow) {pNextwindow->show(); //再显⽰选择的窗⼝}}void TabWidget::sltMenuClicked(IconButton * btn){for (int i = 0; i < m_pTabWidgetList.size(); i++) {TabWidgetItem* item = m_pTabWidgetList.at(i);if (item->icon == btn) {setTabWidgetActivePage(item->id);break;}}}TabWidget::TabWidget(QWidget *parent){initTabWidgetData();setTabWidgetActivePage("real");}(5)⼤功告成我只是把核⼼代码写下来了,别的花⾥胡哨的添加⾃⼰写...。
qtqstyleditemdelegate类
qtqstyleditemdelegate类Qt中的QtStyledItemDelegate类是用于自定义列表、表格和树形控件中的单元格展示样式的类。
在本文中,我将逐步回答关于QtStyledItemDelegate类的一些问题,并讨论其用法和应用场景。
QtStyledItemDelegate类的作用是什么?QtStyledItemDelegate类用于在列表、表格和树形控件中自定义每个单元格的展示样式。
它允许开发人员自由地定义单元格的外观和行为,以满足特定的需求。
使用QtStyledItemDelegate类,我们可以自定义单元格中的文本、图像、复选框、按钮等内容。
这样可以使界面更加美观、直观,并提升用户体验。
如何使用QtStyledItemDelegate类?首先,我们需要在Qt的项目文件(.pro文件)中添加QtWidgets模块的依赖。
在.pro文件中添加一行`QT += widgets`,以确保可以使用QtWidgets 模块中的功能。
接下来,我们需要创建一个继承自QtStyledItemDelegate类的自定义委托类。
可以通过以下代码创建一个委托类的头文件(.h文件):cpp#ifndef CUSTOMDELEGATE_H#define CUSTOMDELEGATE_H#include <QStyledItemDelegate>class CustomDelegate : public QStyledItemDelegate{Q_OBJECTpublic:CustomDelegate(QObject *parent = nullptr);void paint(QPainter *painter, const QStyleOptionViewItem&option, const QModelIndex &index) const override;QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;void setEditorData(QWidget *editor, const QModelIndex&index) const override;void setModelData(QWidget *editor, QAbstractItemModel*model, const QModelIndex &index) const override;void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;};#endif CUSTOMDELEGATE_H在这个自定义委托类中,我们需要重写一些虚函数,例如paint()用于绘制单元格的内容,sizeHint()用于设置单元格的大小,createEditor()用于创建编辑器部件等。
qt中qlabel的用法
qt中qlabel的用法Qt是一款功能强大的跨平台应用程序开发框架,广泛应用于图形界面(GUI)开发。
在Qt中,QLabel是一种常见的控件,用于显示文本或图像。
一、QLabel的基本用法Qt中使用QLabel非常简单,以下是QLabel的基本用法示例:```cpp#include <QtWidgets>int main(int argc, char *argv[]) {QApplication app(argc, argv);QLabel label("欢迎来到Qt世界");label.setAlignment(Qt::AlignCenter);label.show();return app.exec();}```在上述示例中,我们首先包含了QtWidgets模块,然后创建了一个QApplication对象来管理应用程序,在此之后,创建了一个QLabel对象,并设置了其显示的文本为"欢迎来到Qt世界"。
调用`setAlignment()`方法可以设置文本在QLabel中的对齐方式。
最后,调用`show()`方法显示QLabel,并通过`app.exec()`启动应用程序的主事件循环。
二、显示图像除了显示文本,QLabel还可以用于显示图像。
以下是QLabel显示图像的示例:```cpp#include <QtWidgets>int main(int argc, char *argv[]) {QApplication app(argc, argv);QPixmap pixmap("image.jpg");QLabel label;label.setPixmap(pixmap);label.setAlignment(Qt::AlignCenter);label.show();return app.exec();}```在上述示例中,我们使用了QPixmap类来加载图像文件,然后通过`setPixmap()`方法将图像设置给QLabel。
PyQt5高级界面控件之QTableWidget的具体使用方法
PyQt5⾼级界⾯控件之QTableWidget的具体使⽤⽅法前⾔QTableWidget是Qt程序中常⽤的显⽰数据表格的控件,类似于c#中的DataGrid。
QTableWidget是QTableView的⼦类,它使⽤标准的数据模型,并且其单元数据是通过QTableWidgetItem对象来实现的,使⽤QTableWidget时就需要QTableWidgetItem。
⽤来表⽰表格中的⼀个单元格,整个表格就是⽤各个单元格构建起来的QTableWidget类中的常⽤⽅法⽅法描述setROwCount(int row)设置QTableWidget表格控件的⾏数setColumnCount(int col)设置QTableWidget表格控件的列数setHorizontalHeaderLabels()设置QTableWidget表格控件的⽔平标签setVerticalHeaderLabels()设置QTableWidget表格控件的垂直标签setItem(int ,int ,QTableWidgetItem)在QTableWidget表格控件的每个选项的单元控件内添加控件horizontalHeader()获得QTableWidget表格控件的表格头,以便执⾏隐藏rowCount()获得QTableWidget表格控件的⾏数columnCount()获得QTableWidget表格控件的列数setEditTriggers(EditTriggerstriggers)设置表格是否可以编辑,设置表格的枚举值setSelectionBehavior设置表格的选择⾏为setTextAlignment()设置单元格内⽂本的对齐⽅式setSpan(int row,int column,int rowSpanCount,int columnSpanCount)合并单元格,要改变单元格的第row⾏,column列,要合并rowSpancount⾏数和columnSpanCount列数row:要改变的⾏数column:要改变的列数rowSpanCount:需要合并的⾏数columnSpanCount:需要合并的列数setShowGrid()在默认情况下表格的显⽰是有⽹格的,可以设置True或False⽤于是否显⽰,默认TruesetColumnWidth(int column,intwidth)设置单元格⾏的宽度setRowHeight(int row,int height)设置单元格列的⾼度编辑规则的枚举值类型选项值描述QAbstractItemView.NoEditTriggers0No0不能对表格内容进⾏修改QAbstractItemView.CurrentChanged1Editing1任何时候都能对单元格进⾏修改QAbstractItemView.DoubleClicked2Editing2双击单元格QAbstractItemView.SelectedClicked4Editing4单击已经选中的内容QAbstractItemView.EditKeyPressed8Editing8当修改键按下时修改单元格QAbstractItemView.AnyKeyPressed16Editing16按任意键修改单元格QAbstractItemView.AllEditTriggers31Editing31包括以上所有条件表格选择⾏为的枚举值选择值描述QAbstractItemView.SelectItems0Selecting0选中单个单元格QAbstractItemView.SelectRows1Selecting1选中⼀⾏QAbstractItemView.SelectColumns2Selecting2选中⼀列单元格⽂本⽔平对齐⽅式选项描述Qt.AlignLeft将单元格内的内容沿单元格的左边缘对齐Qt.AlignRight将单元格内的内容沿单元格的右边缘对齐Qt.AlignHCenter在可⽤空间中,居中显⽰在⽔平⽅向上Qt.AlignJustify将⽂本在可⽤空间内对齐,默认从左到右单元格⽂本垂直对齐⽅式选项描述Qt.AlignTop与顶部对齐Qt.AlignBottom与底部对齐Qt.AlignVCenter在可⽤空间中,居中显⽰在垂直⽅向上Qt.AlignBaseline与基线对齐如果要设置⽔平和垂直⽅向对齐⽅式,⽐如在表格空间内上下,左右居中对齐,那么只要使⽤Qt,AlignHCenter和Qt,AlignVCenter即可实例:QTableWidget的基本⽤法import sysfrom PyQt5.QtWidgets import *class Table(QWidget):def __init__(self):super(Table, self).__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget例⼦")self.resize(400,300)layout=QHBoxLayout()#实现的效果是⼀样的,四⾏三列,所以要灵活运⽤函数,这⾥只是⽰范⼀下如何单独设置⾏列TableWidget=QTableWidget(4,3)# TableWidget = QTableWidget()# TableWidget.setRowCount(4)# TableWidget.setColumnCount(3)#设置⽔平⽅向的表头标签与垂直⽅向上的表头标签,注意必须在初始化⾏列之后进⾏,否则,没有效果TableWidget.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])#Todo 优化1 设置垂直⽅向的表头标签#TableWidget.setVerticalHeaderLabels(['⾏1', '⾏2', '⾏3', '⾏4'])#TODO 优化 2 设置⽔平⽅向表格为⾃适应的伸缩模式##TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#TODO 优化3 将表格变为禁⽌编辑#TableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)#TODO 优化 4 设置表格整⾏选中#TableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)#TODO 优化 5 将⾏与列的⾼度设置为所显⽰的内容的宽度⾼度匹配#QTableWidget.resizeColumnsToContents(TableWidget)#QTableWidget.resizeRowsToContents(TableWidget)#TODO 优化 6 表格头的显⽰与隐藏#TableWidget.verticalHeader().setVisible(False)#TableWidget.horizontalHeader().setVisible(False)#TOdo 优化7 在单元格内放置控件# comBox=QComboBox()# comBox.addItems(['男','⼥'])# comBox.addItem('未知')# comBox.setStyleSheet('QComboBox{margin:3px}')# TableWidget.setCellWidget(0,1,comBox)## searchBtn=QPushButton('修改')# searchBtn.setDown(True)# searchBtn.setStyleSheet('QPushButton{margin:3px}')# TableWidget.setCellWidget(0,2,searchBtn)#添加数据newItem=QTableWidgetItem('张三')TableWidget.setItem(0,0,newItem)newItem=QTableWidgetItem('男')TableWidget.setItem(0,1,newItem)newItem=QTableWidgetItem('160')TableWidget.setItem(0,2,newItem)layout.addWidget(TableWidget)self.setLayout(layout)if __name__ == '__main__':app=QApplication(sys.argv)win=Table()win.show()sys.exit(app.exec_())初始运⾏程序,显⽰效果如下代码分析构造⼀个QTableWidget对象,设置表格为4⾏3列TableWidget=QTableWidget(4,3)设置表格头TableWidget.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])⽣成⼀个QTableWidgetItem对象,并添加到表格的0⾏0列处 newItem=QTableWidgetItem('张三')TableWidget.setItem(0,0,newItem)优化1:设置垂直⽅向表格头标签TableWidget.setVerticalHeaderLabels(['⾏1', '⾏2', '⾏3', '⾏4'])效果如下优化2:设置表格头为伸缩模式使⽤QTableWidget对象的horizontalHeader()函数,设置表格为⾃适应的伸缩模式,即可根据窗⼝的⼤⼩来改变⽹格的⼤⼩TableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)优化3:将表格设置为禁⽌编辑在默认情况下,表格中的字符是可以更改的,⽐如双击⼀个单元格,就可以修改原来的内容,如果想禁⽌这种操作,让表格对⽤户只是只读,则可以编辑⼀下代码TableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)优化4:表格整⾏选中表格默认选择的是单个单元格,通过以下代码可以设置整⾏选中TableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)优化5:将⾏与列的宽度⾼度与⽂本内容的宽⾼相匹配QTableWidget.resizeColumnsToContents(TableWidget) QTableWidget.resizeRowsToContents(TableWidget)优化6:表格头的显⽰与隐藏TableWidget.verticalHeader().setVisible(False)TableWidget.horizontalHeader().setVisible(False)优化7:在单元格内放置控件QTableWidget不仅允许往单元格内放置⽂字,还允许放置控件,通过QTableWidget.setItem()来添加PyQt的基本控件这⾥把⼀个下拉列表框和⼀个按钮加⼊单元格中,设置控件与单元格的边距,如为3px像素,代码如下comBox=QComboBox()comBox.addItems(['男','⼥'])comBox.addItem('未知')comBox.setStyleSheet('QComboBox{margin:3px}')TableWidget.setCellWidget(0,1,comBox)searchBtn=QPushButton('修改')searchBtn.setDown(True)searchBtn.setStyleSheet('QPushButton{margin:3px}')TableWidget.setCellWidget(0,2,searchBtn)实例⼆:在表格中快速定位到指定⾏import sysfrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import *class Table(QWidget):def __init__(self):super(Table, self).__init__()self.initUI()def initUI(self):#设置标题与初始⼤⼩self.setWindowTitle('QTableWidget例⼦')self.resize(600,800)##⽔平布局layout=QHBoxLayout()#实例化表格视图(30*4)tablewidget=QTableWidget(30,4)layout.addWidget(tablewidget)for i in range(30):for j in range(4):itemContent='(%d,%d)'%(i,j)#为每个表格内添加数据tablewidget.setItem(i,j,QTableWidgetItem(itemContent)) self.setLayout(layout)#遍历表格查找对应项text='(10,1)'items=tablewidget.findItems(text,Qt.MatchExactly)item=items[0]#选中单元格item.setSelected(True)#设置单元格的背脊颜⾊为红item.setForeground(QBrush(QColor(255,0,0)))row=item.row()#通过⿏标滚轮定位,快速定位到第⼗⼀⾏tablewidget.verticalScrollBar().setSliderPosition(row)if __name__ == '__main__':app=QApplication(sys.argv)table=Table()table.show()sys.exit(app.exec_())效果如图实例三:QTableWidget的⾼级⽤法import sysfrom PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem) from PyQt5.QtGui import QBrush, QColor, QFontfrom PyQt5.QtCore import Qtclass Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):#设置标题与初始⼤⼩self.setWindowTitle("QTableWidget 例⼦")self.resize(430, 230)#⽔平布局,初始表格为(4*3),添加到布局中conLayout = QHBoxLayout()tableWidget = QTableWidget(5,3)conLayout.addWidget(tableWidget)#设置⽔平头标签tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])#创建新条⽬,设置背景颜⾊,添加到表格指定⾏列中newItem = QTableWidgetItem("张三")#newItem.setForeground(QBrush(QColor(255, 0, 0)))tableWidget.setItem(0, 0, newItem)# 创建新条⽬,设置背景颜⾊,添加到表格指定⾏列中newItem = QTableWidgetItem("男")#newItem.setForeground(QBrush(QColor(255, 0, 0)))tableWidget.setItem(0, 1, newItem)# 创建新条⽬,设置背景颜⾊,添加到表格指定⾏列中newItem = QTableWidgetItem("160")#newItem.setForeground(QBrush(QColor(255, 0, 0)))tableWidget.setItem(0, 2, newItem)# newItem = QTableWidgetItem("李四")# #将字体加粗,⿊⾊字体# newItem.setFont(QFont('Times',12,QFont.Black))# tableWidget.setItem(1, 0, newItem)## # 创建新条⽬,设置背景颜⾊,添加到表格指定⾏列中# newItem = QTableWidgetItem("男")# newItem.setFont(QFont('Times', 12, QFont.Black))# tableWidget.setItem(1, 1, newItem)## # 创建新条⽬,设置背景颜⾊,添加到表格指定⾏列中# newItem = QTableWidgetItem("150")# newItem.setFont(QFont('Times', 12, QFont.Black))# tableWidget.setItem(1, 2, newItem)## newItem = QTableWidgetItem("王五")# #将字体加粗,⿊⾊字体# newItem.setFont(QFont('Times',12,QFont.Black))# tableWidget.setItem(2, 0, newItem)## # 创建新条⽬,设置背景颜⾊,添加到表格指定⾏列中# newItem = QTableWidgetItem("⼥")# newItem.setFont(QFont('Times', 12, QFont.Black))# tableWidget.setItem(2, 1, newItem)## # 创建新条⽬,设置背景颜⾊,添加到表格指定⾏列中# newItem = QTableWidgetItem("175")# newItem.setFont(QFont('Times', 12, QFont.Black))# 设置单元格⽂本的对齐⽅式#newItem.setTextAlignment(Qt.AlignRight|Qt.AlignBottom) #tableWidget.setItem(2, 2, newItem)#按照体重排序#Qt.DescendingOrder降序#Qt.AscEndingOrder升序#tableWidget.sortItems(2,Qt.DescendingOrder)#合并单元格#tableWidget.setSpan(2,0,4,1)#设置单元格的⼤⼩#将第⼀列的单元宽度设置为150#tableWidget.setColumnWidth(0,150)#将第⼀⾏的单元格⾼度的设置为120#tableWidget.setRowHeight(0,120)#表格中不显⽰分割线#tableWidget.setShowGrid(False)#隐藏垂直头标签#tableWidget.verticalHeader().setVisible(False)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())初始运⾏,效果如下优化1:设置单元格的⽂本颜⾊,将第⼀⾏中的三个⽂本颜⾊设置为红⾊newItem.setForeground(QBrush(QColor(255, 0, 0)))优化2:将字体加粗#设置字体类型,⼤⼩号,颜⾊newItem.setFont(QFont('Times',12,QFont.Black))优化3:设置单元格的排序⽅式from PyQt5.QtCore import Qt#按照体重排序#Qt.DescendingOrder降序#Qt.AscEndingOrder升序tableWidget.sortItems(2,Qt.DescendingOrder)优化4:单元格的⽂本对齐⽅式这⾥更改了王五体重的⽂本对齐⽅式为右下⾓处# 设置单元格⽂本的对齐⽅式(右下)newItem.setTextAlignment(Qt.AlignRight|Qt.AlignBottom)tableWidget.setItem(2, 2, newItem)优化5:合并单元格将表格中第⼀⾏第⼀列的单元格,更改为占据5⾏1列#合并单元格tableWidget.setSpan(2,0,5,1)优化6:设置单元格的⼤⼩这⾥将第⼀⾏宽度设置为150,⾼度设置为120#将第⼀列的单元宽度设置为150tableWidget.setColumnWidth(0,150)#将第⼀⾏的单元格⾼度的设置为120tableWidget.setRowHeight(0,120)优化7:在表格中不显⽰分割线QTableWidget类的setShowGrid()函数是从QTableView类继承的,⽤来设置是否显⽰表格的分割线,默认显⽰分割线#表格中不显⽰分割线tableWidget.setShowGrid(False)优化8:为单元格添加图⽚还可以在单元格内添加图⽚并显⽰图⽚描述信息,代码如下这⾥图⽚放置在王五体重的单元格内#添加图⽚newItem = QTableWidgetItem(QIcon("./images/bao1.png"), "背包")tableWidget.setItem(2, 2, newItem)实例四:单元格内图⽚的显⽰import sysfrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import *class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):#设置标题与初始⼤⼩self.setWindowTitle("QTableWidget 例⼦")self.resize(1000 ,900);#设置布局,初始表格5*3conLayout = QHBoxLayout()table= QTableWidget(5,3)#设置表格⽔平头标签table.setHorizontalHeaderLabels(['图⽚1' ,'图⽚2' ,'图⽚3']) #设置不可编辑模式table.setEditTriggers( QAbstractItemView.NoEditTriggers) #设置图⽚的⼤⼩table.setIconSize(QSize(300 ,200))#设置所有⾏列宽⾼数值与图⽚⼤⼩相同for i in range(3): # 让列宽和图⽚相同table.setColumnWidth(i , 300)for i in range(5): # 让⾏⾼和图⽚相同table.setRowHeight(i , 200)for k in range(15):i = k/ 3j = k % 3#实例化表格窗⼝条⽬item = QTableWidgetItem()#⽤户点击表格时,图⽚被选中item.setFlags(Qt.ItemIsEnabled)#图⽚路径设置与图⽚加载icon = QIcon(r'.\images\bao%d.png' % k)item.setIcon(QIcon(icon))#输出当前进⾏的条⽬序号print('e/icons/%d.png i=%d j=%d' % (k, i, j))#将条⽬加载到相应⾏列中table.setItem(i, j, item)conLayout.addWidget(table)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())效果如下实例五:⽀持右键菜单import sysfrom PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtGui import *class Table(QWidget):def __init__(self):super(Table, self).__init__()self.initUI()def initUI(self):# 设置标题与初始⼤⼩self.setWindowTitle('QTableWidget demo')self.resize(500, 300)# ⽔平布局,初始表格5*3,添加到布局layout = QHBoxLayout()self.tableWidget = QTableWidget(5, 3)layout.addWidget(self.tableWidget)# 设置表格⽔平⽅向的头标签self.tableWidget.setHorizontalHeaderLabels([ '姓名', '性别', '体重' ])# 设置⽔平⽅向⾃动伸缩填满窗⼝self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)# 添加数据到指定⾏列newItem = QTableWidgetItem("张三")self.tableWidget.setItem(0, 0, newItem)newItem = QTableWidgetItem("男")self.tableWidget.setItem(0, 1, newItem)newItem = QTableWidgetItem("160")self.tableWidget.setItem(0, 2, newItem)newItem = QTableWidgetItem("李四")self.tableWidget.setItem(1, 0, newItem)newItem = QTableWidgetItem("⼥")self.tableWidget.setItem(1, 1, newItem)newItem = QTableWidgetItem("120")self.tableWidget.setItem(1, 2, newItem)# 允许右键产⽣菜单self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu)# 将右键菜单绑定到槽函数generateMenuself.tableWidget.customContextMenuRequested.connect(self.generateMenu)self.setLayout(layout)def generateMenu(self, pos):# 计算有多少条数据,默认-1,row_num = -1for i in self.tableWidget.selectionModel().selection().indexes():row_num = i.row()# 表格中只有两条有效数据,所以只在前两⾏⽀持右键弹出菜单if row_num < 2:menu = QMenu()item1 = menu.addAction(u'选项⼀')item2 = menu.addAction(u'选项⼆')item3 = menu.addAction(u'选项三')action = menu.exec_(self.tableWidget.mapToGlobal(pos))# 显⽰选中⾏的数据⽂本if action == item1:print('你选了选项⼀,当前⾏⽂字内容是:', self.tableWidget.item(row_num, 0).text(), self.tableWidget.item(row_num, 1).text(),self.tableWidget.item(row_num, 2).text())if action == item2:print('你选了选项⼆,当前⾏⽂字内容是:', self.tableWidget.item(row_num, 0).text(), self.tableWidget.item(row_num, 1).text(),self.tableWidget.item(row_num, 2).text())if action == item3:print('你选了选项三,当前⾏⽂字内容是:', self.tableWidget.item(row_num, 0).text(),self.tableWidget.item(row_num, 1).text(),self.tableWidget.item(row_num, 2).text())if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())相关⽂件及下载地址:到此这篇关于PyQt5⾼级界⾯控件之QTableWidget的具体使⽤⽅法的⽂章就介绍到这了,更多相关PyQt5 QTableWidget内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
qt qstyle类委托用法
qt qstyle类委托用法QStyle类是Qt中的一个重要类,用于控制控件的外观和行为。
它主要通过委托(delegate)的方式来实现对特定控件的样式定制。
委托(delegate)是Qt中一种灵活的定制控件外观和行为的机制。
我们可以通过继承QStyle类,并重写其中的方法来实现对控件的定制。
然后,通过将委托对象应用到特定的控件上,就能够实现这个控件的样式定制。
具体使用QStyle类的委托功能,可以按照以下步骤进行:1.创建自定义的委托类,继承自QStyle类,并根据需要重写其中的方法。
可以重写的方法包括paint()、subElementRect()、drawControl()等,具体方法的重写取决于要定制的控件和样式。
2.对需要定制样式的控件,设置使用自定义委托类。
可以使用QWidget::setStyle()方法来设置全局样式,也可以使用QStyleFactory::create()方法来创建一个委托对象,并使用setStyle()方法设置到特定控件上。
3.根据需要,调整自定义委托类的属性和样式,以实现控件外观和行为的定制。
可以通过重写其构造函数或使用setter方法来修改委托的属性。
除了使用自定义的委托类外,Qt还提供了一些预定义的委托类,可以直接使用或继承。
例如,QStyledItemDelegate类是用于定制列表视图和表格视图的委托类,可以实现对单元格的定制。
总结起来,QStyle类是Qt中用于控制控件外观和行为的重要类,通过委托机制可以实现对特定控件的样式定制。
使用委托功能时,需要创建自定义的委托类,并应用到特定控件上,然后通过重写委托类的方法和修改属性来实现对控件的外观和行为的定制。
Qt中的QTableWidget
Qt中的QTableWidget最近天⽓真热啊,下午的话,基本没什么效率,热死⼈了。
今天吃饭的时候看了⼀下Qt中的QTableWidget的API。
官⽅⽂档是:( QWidget * parent = 0 )( int rows, int columns, QWidget * parent = 0 )()QWidget * ( int row, int column ) constvoid ( QTableWidgetItem * item )int ( const QTableWidgetItem * item ) constint () constint () constQTableWidgetItem * () constint () constvoid ( QTableWidgetItem * item )QList<QTableWidgetItem *> ( const QString & text, Qt::MatchFlags flags ) constQTableWidgetItem * ( int column ) constQTableWidgetItem * ( int row, int column ) constQTableWidgetItem * ( const QPoint & point ) constQTableWidgetItem * ( int ax, int ay ) constconst QTableWidgetItem * () constvoid ( QTableWidgetItem * item )void ( int row, int column )int ( const QTableWidgetItem * item ) constint () constQList<QTableWidgetItem *> ()QList<QTableWidgetSelectionRange> () constvoid ( int row, int column, QWidget * widget )void ( int columns )void ( int row, int column )void ( int row, int column, QItemSelectionModel::SelectionFlags command )void ( QTableWidgetItem * item )void ( QTableWidgetItem * item, QItemSelectionModel::SelectionFlags command ) void ( int column, QTableWidgetItem * item )void ( const QStringList & labels )void ( int row, int column, QTableWidgetItem * item )void ( const QTableWidgetItem * item )void ( const QTableWidgetSelectionRange & range, bool select )void ( int rows )void ( int row, QTableWidgetItem * item )void ( const QStringList & labels )void ( int column, Qt::SortOrder order = Qt::AscendingOrder ) QTableWidgetItem * ( int column )QTableWidgetItem * ( int row, int column )QTableWidgetItem * ( int row )QTableWidgetItem * ( int row ) constint ( int logicalColumn ) constQRect ( const QTableWidgetItem * item ) constint ( int logicalRow ) const34 public functions inherited from57 public functions inherited from17 public functions inherited from14 public functions inherited from221 public functions inherited from29 public functions inherited from13 public functions inherited fromPublic Slotsvoid ()void ()void ( int column )void ( int row )void ( int column )void ( int row )void ( const QTableWidgetItem * item, QAbstractItemView::ScrollHint hint = EnsureVisible )11 public slots inherited from9 public slots inherited from19 public slots inherited from1 public slot inherited fromSignalsvoid ( int row, int column )void ( int row, int column )void ( int row, int column )void ( int row, int column )void ( int row, int column )void ( int row, int column )void ( int currentRow, int currentColumn, int previousRow, int previousColumn )void ( QTableWidgetItem * current, QTableWidgetItem * previous )void ( QTableWidgetItem * item )void ( QTableWidgetItem * item )void ( QTableWidgetItem * item )void ( QTableWidgetItem * item )void ( QTableWidgetItem * item )void ( QTableWidgetItem * item )void ()6 signals inherited from1 signal inherited from1 signal inherited fromProtected Functionsvirtual bool ( int row, int column, const QMimeData * data, Qt::DropAction action ) QModelIndex ( QTableWidgetItem * item ) constQTableWidgetItem * ( const QModelIndex & index ) constQList<QTableWidgetItem *> ( const QMimeData * data ) constvirtual QMimeData * ( const QList<QTableWidgetItem *> items ) constvirtual QStringList () constvirtual Qt::DropActions () constReimplemented Protected Functionsvirtual void ( QDropEvent * event )virtual bool ( QEvent * e )14 protected functions inherited from36 protected functions inherited from18 protected functions inherited from3 protected functions inherited from37 protected functions inherited from8 protected functions inherited from1 protected function inherited fromAdditional Inherited Members4 static public members inherited from7 static public members inherited from6 protected slots inherited from9 protected slots inherited from1 protected slot inherited from1 protected slot inherited from1. 将表格变为禁⽌编辑在默认情况下,表格⾥的字符是可以更改的,⽐如双击⼀个单元格,就可以修改原来的内容,如果想禁⽌⽤户的这种操作,让这个表格对⽤户只读,可以这样:tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); QAbstractItemView.NoEditTriggers 是QAbstractItemView.EditTrigger枚举中的⼀个,都是触发修改单元格内容的条件:QAbstractItemView.NoEditTriggersNo editing possible. 不能对表格内容进⾏修改QAbstractItemView.CurrentChanged1Editing start whenever current item changes.任何时候都能对单元格修改QAbstractItemView.DoubleClicked2Editing starts when an item is double clicked.双击单元格QAbstractItemView.SelectedClicked4Editing starts when clicking on an already selected item.单击已选中的内容QAbstractItemView.EditKeyPressed8Editing starts when the platform. edit key has been pressed over an item.QAbstractItemView.AnyKeyPressed16Editing starts when any key is pressed over an item.按下任意键就能修改QAbstractItemView.AllEditTriggers31Editing starts for all above actions.以上条件全包括2. 设置表格为整⾏选择tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整⾏选中的⽅式QAbstractItemView.SelectionBehavior枚举还有如下类型ConstantValueDescriptionQAbstractItemView.SelectItemsSelecting single items.选中单个单元格QAbstractItemView.SelectRows1Selecting only rows.选中⼀⾏QAbstractItemView.SelectColumns2Selecting only columns.选中⼀列3.单个选中和多个选中的设置:tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); //设置为可以选中多个⽬标该函数的参数还可以是:QAbstractItemView.NoSelection 不能选择QAbstractItemView.SingleSelection 选中单个⽬标QAbstractItemView.MultiSelection 选中多个⽬标QAbstractItemView.ExtendedSelection QAbstractItemView.ContiguousSelection 的区别不明显,主要功能是正常情况下是单选,但按下Ctrl或Shift键后,可以多选4. 表格表头的显⽰与隐藏对于⽔平或垂直⽅法的表头,可以⽤以下⽅式进⾏隐藏/显⽰的设置:view plaintableWidget->verticalHeader()->setVisible(false); //隐藏列表头tableWidget->horizontalHeader()->setVisible(false); //隐藏⾏表头注意:需要 #include <QHeaderView>5. 对表头⽂字的字体、颜⾊进⾏设置view plainQTableWidgetItem *columnHeaderItem0 = tableWidget->horizontalHeaderItem(0); //获得⽔平⽅向表头的Item对象columnHeaderItem0->setFont(QFont("Helvetica")); //设置字体columnHeaderItem0->setBackgroundColor(QColor(0,60,10)); //设置单元格背景颜⾊columnHeaderItem0->setTextColor(QColor(200,111,30)); //设置⽂字颜⾊注意:需要 #include <QHeaderView>6. 在单元格⾥加⼊控件:QTableWidget不仅允许把⽂字加到单元格,还允许把控件也放到单元格中。
PyQt5之QTableView添加复选框(自定义委托)
PyQt5之QTableView添加复选框(⾃定义委托)import sysfrom untitled import Ui_Formfrom PyQt5.QtWidgets import QApplication, QWidget, QStyleOptionButton, QAbstractItemDelegate, QStyle, QCheckBox, QStyledItemDelegate, QStyleOptionViewItem, QItemDelegate from PyQt5.QtCore import Qt, QAbstractTableModel, QModelIndex, QVariant, QThread, pyqtSignal, QEvent, QRectfrom PyQt5.QtGui import QColor, QMouseEventclass WorkThread(QThread):scrollBottomSignal = pyqtSignal()addDataSignal = pyqtSignal()def __init__(self, model):super(WorkThread, self).__init__()self.model = modelself.run_flag = Truedef run(self):while self.run_flag:self.addDataSignal.emit()self.scrollBottomSignal.emit()leep(1) # 不加延迟界⾯会卡顿。
def stop(self):self.run_flag = Falseclass MyTableModel(QAbstractTableModel):def __init__(self):super(MyTableModel, self).__init__()self._data = [] # 要显⽰的数据self._headers = ['选项', '姓名', '年龄', '性别'] # 表头def rowCount(self, parent=QModelIndex()):"""返回⾏数量。
QTableView使用自定义委托(QItemDelegate)
QTableView使⽤⾃定义委托(QItemDelegate)需要在表格中绘制流程图,主要有箭头,⽅向,颜⾊,字符串,由于QTableView没有可⽤的绘制函数,所以需要⾃⼰去定义、委托(delegate)继承QItemDelegate,模型(model)继承QAbstractTableModel,表头(headerview)继承QHeaderView,表(table)继承QTableView这⾥只实现绘制显⽰功能,如果需要进⾏编辑还需另外重写createEditor setEditorData setModelData 函数如下是实现效果图1/********************ArrowDelegate********************/2class ArrowDelegate : public QItemDelegate3 {4 Q_OBJECT56public:78 ArrowDelegate(QObject* parent = 0);9virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;1011protected:1213private:14 };1516/********************TableModel********************/17class TableModel : public QAbstractTableModel18 {19 Q_OBJECT2021public:2223 TableModel(QObject *parent = 0);24 ~TableModel(void);25void setHorizontalHeaderList(QStringList horizontalHeaderList);26void setVerticalHeaderList(QStringList verticalHeaderList);27int rowCount(const QModelIndex &parent = QModelIndex()) const;28int columnCount(const QModelIndex &parent = QModelIndex()) const;29 QVariant data(const QModelIndex &index, int role) const;30 QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;31 Qt::ItemFlags flags(const QModelIndex &index) const;32void setModalDatas(QList< QStringList > *rowlist);33void refrushModel();3435protected:3637 signals:3839void updateCount(int count);4041private:4243 QStringList horizontal_header_list;44 QStringList vertical_header_list;45 QList< QStringList > *arr_row_list;4647 };4849class MyHeader : public QHeaderView50 {51 Q_OBJECT5253public:54 MyHeader(QWidget *parent = 0);//:QHeaderView(Qt::Horizontal, parent)5556protected:57void mouseReleaseEvent(QMouseEvent *e);5859 signals:60void refresh();61 };62/********************ReadOnlyTableView********************/63class MyTableView : public QTableView64 {65 Q_OBJECT6667public:70 ~MyTableView(void);71void addRow(QStringList rowList);72void clearAllRow(int row);//数据清空73int rowCount();7475public slots:7677void remove();78void clear();79void changeValue();80void refreshmymodel();8182void mouseReleaseEvent(QMouseEvent *event);83private:8485void initHeader();8687private:88 MyHeader *myheader;89 TableModel *mymodel;90 QList< QStringList > grid_data_list;91 ArrowDelegate *arrow_delegate;92int row;93 signals:9495void updateCount(int count);96 };1 #include "tableview.h"2 #include "math.h"3 #include <QApplication>4 #include <QPen>56int g_x;7/********************ArrowDelegate********************/8 ArrowDelegate::ArrowDelegate(QObject *parent)9 : QItemDelegate(parent)10 {11 g_x = 0;12 }1314void ArrowDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const 15 {16int row = index.row();17int x = option.rect.x();18int y = option.rect.y();19int width = option.rect.width();20int height = option.rect.height();21 QPen pen_black;22 pen_black.setWidth(2);23 pen_black.setColor(QColor(Qt::black));24 QStyleOptionViewItem myOption = option;2526if (index.column() == 2)//UE27 {28 QPainterPath path_UE;2930 QPoint One;31 QPoint Two;32// pen.setWidth(2);33 One.setX(x + width / 2);34 One.setY(y);35 Two.setX(x + width / 2);36 Two.setY(y + height);37 path_UE.moveTo(One);38 path_UE.lineTo(Two);39 painter->setPen(pen_black);40 painter->drawPath(path_UE);41 }4243if (index.column() == 3)44 {45 g_x = x + width / 2;//get the begin46 QPainterPath path_SENB;4748 QPoint One;49 QPoint Two;50 One.setX(x + width / 2);51 One.setY(y);55 path_SENB.lineTo(Two);56// pen.setColor(QColor(Qt::black));57 painter->setPen(pen_black);58 painter->drawPath(path_SENB);59// g_y = y + height / 2;60 }61if (index.column() == 4)62 {63 QString str4 = index.model()->data(index,Qt::DisplayRole).toString(); 64if (!str4.isEmpty())65 {66 QPainterPath path_TENB;6768 QPoint One;69 QPoint Two;70// pen.setWidth(2);71 One.setX(x + width / 2);72 One.setY(y);73 Two.setX(x + width / 2);74 Two.setY(y + height);75 path_TENB.moveTo(One);76 path_TENB.lineTo(Two);77 painter->setPen(pen_black);78 painter->drawPath(path_TENB);79 }80 }8182if (index.column() == 5)83 {84 QPainterPath path,path_SMME;85 QPen pen;86 QPoint One;87 QPoint Two;88// pen5.setWidth(2);89 One.setX(x + width / 2);90 One.setY(y);91 Two.setX(x + width / 2);92 Two.setY(y + height);93 path_SMME.moveTo(One);94 path_SMME.lineTo(Two);95// pen5.setColor(QColor(Qt::black));96 painter->setPen(pen_black);97 painter->drawPath(path_SMME);9899 QString str = index.model()->data(index,Qt::DisplayRole).toString(); 100if (str.isEmpty())101return;//break this turn102 QStringList strList = str.split("+");103 QString text = strList.at(0);104int direction = strList.at(1).toInt();105106 myOption.displayAlignment = Qt::AlignCenter;107108 QRectF rect;109 pen.setWidth(1);110if (direction)111 {112 pen.setColor(QColor(255,0,0));//red113// One.setX(x);114// One.setY(y + 3 * height / 4);115 One.setX(g_x);116 One.setY(y + 3 * height / 4);117 Two.setX(x + width / 2);118 Two.setY(y + 3 * height / 4);119// painter->drawText(One,text);120 }121else122 {123 pen.setColor(QColor(0,0,255));124// Two.setX(x);125// Two.setY(y + 3 * height / 4);126 Two.setX(g_x);127 Two.setY(y + 3 * height / 4);128 One.setX(x + width / 2);129 One.setY(y + 3 * height / 4);130// painter->drawText(Two,text);131 }132133int Height = 20;134// QPoint Three(x + width / 2 , y + height / 3);135136double slopy , cosy , siny;139 cosy = cos( slopy );140 siny = sin( slopy );141142143 path.moveTo(One);144 path.lineTo(Two);145146147 path.moveTo(Two);148 path.lineTo(Two.x() + int( Par * cosy - ( Par / 2.0 * siny ) ),149 Two.y() + int( Par * siny + ( Par / 2.0 * cosy ) ) );150 path.moveTo(Two);151 path.lineTo(Two.x() + int( Par * cosy - ( Par / 2.0 * siny ) ),152 Two.y() - int( Par * siny + ( Par / 2.0 * cosy ) ) );153154 painter->setPen(pen);155 painter->drawPath(path);156157// pen.setColor(QColor(Qt::black));158 painter->setPen(pen_black);159 rect.setTopLeft(QPointF(g_x,y));160 rect.setBottomRight(QPointF(x + width / 2,y + height / 2));161// rect(QPointF(g_x,y),QPointF(x + width / 2,y + height / 2)); 162 QTextOption textOption;163 textOption.setAlignment(Qt::AlignCenter);164 painter->drawText(rect,text,textOption);165 }166else167 {168return QItemDelegate::paint (painter, option, index);169 }170 }171172/********************TableModel********************/173 TableModel::TableModel(QObject *parent)174 : QAbstractTableModel(parent), arr_row_list(NULL)175 {176177 }178179 TableModel::~TableModel(void)180 {181 arr_row_list = NULL;182 }183184void TableModel::setHorizontalHeaderList(QStringList horizontalHeaderList) 185 {186 horizontal_header_list = horizontalHeaderList;187 }188189void TableModel::setVerticalHeaderList(QStringList verticalHeaderList) 190 {191 vertical_header_list = verticalHeaderList;192 }193194int TableModel::rowCount(const QModelIndex &parent) const195 {196if(vertical_header_list.size() > 0)197return vertical_header_list.size();198199if(NULL == arr_row_list)200return0;201else202return arr_row_list->size();203 }204205int TableModel::columnCount(const QModelIndex &parent) const206 {207if(horizontal_header_list.size() > 0)208return horizontal_header_list.size();209210if(NULL == arr_row_list)211return0;212else if(arr_row_list->size() < 1)213return0;214else215return arr_row_list->at(0).size();216 }217218 QVariant TableModel::data(const QModelIndex &index, int role) const219 {220if (!index.isValid())223if(NULL == arr_row_list)224return QVariant();225226if(arr_row_list->size() < 1)227return QVariant();228229if (role == Qt::TextAlignmentRole)230 {231return int(Qt::AlignLeft | Qt::AlignVCenter);232 }233else if (role == Qt::DisplayRole)234 {235if(index.row() >= arr_row_list->size())236return QVariant();237if(index.column() >= arr_row_list->at(0).size())238return QVariant();239return arr_row_list->at(index.row()).at(index.column());240 }241return QVariant();242 }243244 QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const 245 {246if(role==Qt::DisplayRole)247 {248if(orientation==Qt::Horizontal)249 {250if(horizontal_header_list.size() > section)251return horizontal_header_list[section];252else253return QVariant();254 }255else256 {257if(vertical_header_list.size() > section)258return vertical_header_list[section];259else260return QVariant();261 }262 }263264return QVariant();265 }266267 Qt::ItemFlags TableModel::flags(const QModelIndex &index) const268 {269if (!index.isValid())270return Qt::NoItemFlags;271272 Qt::ItemFlags flag = QAbstractItemModel::flags(index);273274// flag|=Qt::ItemIsEditable275return flag;276 }277278void TableModel::setModalDatas(QList< QStringList > *rowlist)279 {280 arr_row_list = rowlist;281 }282283void TableModel::refrushModel()284 {285 beginResetModel();286 endResetModel();287288 emit updateCount(this->rowCount(QModelIndex()));289 }290291/********************TableView********************/292 MyTableView::MyTableView(QWidget *parent)293 : QTableView(parent)294 {295this->setAlternatingRowColors(true);296// this->setStyleSheet( "QTableView{background-color: rgb(250, 250, 115);"297// "alternate-background-color: rgb(141, 163, 215);}" );//298this->setSelectionBehavior(QAbstractItemView::SelectRows);299this->horizontalHeader()->setStretchLastSection(true);300this->horizontalHeader()->setHighlightSections(false);301this->verticalHeader()->setVisible(false);302this->setShowGrid(false);303this->setEditTriggers(QAbstractItemView::NoEditTriggers);304this->setSelectionMode(QAbstractItemView::ExtendedSelection);307 mymodel = new TableModel();308this->setModel(mymodel);309 myheader = new MyHeader;310 myheader->setModel(mymodel);311this->setHorizontalHeader(myheader);312313this->initHeader();314 mymodel->setModalDatas(&grid_data_list);315 arrow_delegate = new ArrowDelegate();316this->setItemDelegate(arrow_delegate);317318319 connect(mymodel, SIGNAL(updateCount(int)), this, SLOT(updateCount(int ))); 320 connect(myheader,SIGNAL(refresh()),this,SLOT(refreshmymodel()));321322 }323324 MyTableView::~MyTableView(void)325 {326if(arrow_delegate) {327 delete arrow_delegate;328 arrow_delegate = NULL;329 }330331if(mymodel) {332 delete mymodel;333 mymodel = NULL;334 }335 grid_data_list.clear();336 }337338void MyTableView::addRow(QStringList rowList)339 {340 grid_data_list.append(rowList);341 mymodel->refrushModel();342 }343344void MyTableView::clearAllRow(int row)345 {346this->row = row;347 grid_data_list.clear();348 mymodel->refrushModel();349 }350351void MyTableView::remove()352 {353 QModelIndexList model_index_list = this->selectedIndexes();354int model_count = model_index_list.count();355if(model_count <= 0)356return;357358 QList<int> list_row;359for(int i=model_count-1; i>=0; i--)360 {361 QModelIndex model_index = model_index_list.at(i);362int row = model_index.row();363if(!list_row.contains(row))364 list_row.append(row);365 }366367if(list_row.isEmpty())368return;369370 qSort(list_row);371372for(int i=list_row.count()-1; i>=0; i--)373 {374 grid_data_list.removeAt(list_row.at(i));375 }376377 mymodel->refrushModel();378 }379380void MyTableView::clear()381 {382 grid_data_list.clear();383 mymodel->refrushModel();384 }385386int MyTableView::rowCount()387 {388return mymodel->rowCount(QModelIndex());391void MyTableView::initHeader()392 {393 QStringList header;394 header<<"NO"<<"Time"<<"UE"<<"S-ENB"<<"T-ENB"<<"S-MME"<<"T-MME"<<"SGSN"395 <<"S-SGW"<<"T-SGW"<<"PGW/GGSN"<<"HSS/EIR"<<"PCRF"<<"AAA/ALP"<<"AF";396 mymodel->setHorizontalHeaderList(header);397// MyHeader *h = new MyHeader(this->horizontalHeader());398399 }400401402void MyTableView::refreshmymodel()403 {404 mymodel->refrushModel();405 }406407408 MyHeader::MyHeader(QWidget *parent):QHeaderView(Qt::Horizontal, parent)409 {410411 }412413void MyHeader::mouseReleaseEvent(QMouseEvent *e)414 {415 emit refresh();416 }通过全局变量保存箭头的左边点,函数计算箭头的头部画线路径。
Qt用委托绘制需要的图形的步骤
Qt⽤委托绘制需要的图形的步骤1.拷贝⼀份option:QStyleOptionViewItemV4 opt = option;2.获取到widget,也是通过QStyleOptionViewItem &option 然后类型转换QStyleOptionViewItemV3 ,调⽤成员widget实现:const QWidget * CSMSDelegate::widget(const QStyleOptionViewItem &option) const{if (const QStyleOptionViewItemV3 *v3 = qstyleoption_cast<const QStyleOptionViewItemV3 *>(&option))return v3->widget;return 0;}const QWidget *widget = CSMSDelegate::widget(option);3.subElementRec获取到⼦控件的坐标,⾃此我们需要画的控件的参考坐标就有了:QStyle *style = widget ? widget->style() : QApplication::style();QRect textItemRect = style->subElementRect(QStyle::SE_ItemViewItemText, &opt, widget);4.然后就是根据⽂字内容的坐标各种计算坐标和尺⼨;f.setBold(true);painter->setFont(f);painter->setPen(QColor("#ffffff"));painter->drawText(textx,titley,userstrW,lh, flag, senduserstr);painter->restore();把需要的字体,颜⾊设置到painter,然后调⽤drawText⽅法来画出内容;最后⽤restore()来恢复画笔;委托⾥⾯⼏个⽅法的重新实现:1.void paint(QPainter* painter, const QStyleOptionViewItem& option,const QModelIndex& index ) const;option求出widget,然后painter⽤drawText画出内容;2.QSize sizeHint(const QStyleOptionViewItem &option,const QModelIndex &index) const;返回每个index的⼤⼩(我们需要的⼤⼩?)3.bool editorEvent(QEvent *event, QAbstractItemModel *model,const QStyleOptionViewItem &option, const QModelIndex &index);⼀些⿏标事件之类的事件处理。
qtableview用法
qtableview用法
QTableView是Qt框架中的一个控件,用于显示数据。
它可以显示各种类型的数据,包括文本、数字、日期、图像等等。
使用QTableView时,我们需要提供一个数据模型来存储和管理数据。
QTableView可以显示表格中的数据,并允许用户对其进行排序、过滤、编辑等操作。
QTableView的使用非常简单,只需要创建一个QTableView对象,并设置其数据模型即可。
为了使QTableView能够正确地显示数据,我们需要为每一列设置一个QHeaderView。
还可以通过设置QTableView的样式来改变表格的外观。
当我们使用QTableView时,还可以通过信号和槽机制来实现一些功能,比如响应用户的单击事件、编辑数据等。
此外,QTableView还支持多种选择模式,可以通过代码来设置选择模式。
总之,使用QTableView可以轻松地实现数据表格的显示和管理,为我们的应用程序提供更好的用户体验。
- 1 -。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. } }
//设置时间格式字符串 分:秒 QString text = QString("%1:%2") .arg(secs / 60, 2, 10, QChar('0')) .arg(secs % 60, 2, 10, QChar('0')); //获取项风格设置 QStyleOptionViewItem myOption = option; myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; //绘制文本 drawDisplay(painter, myOption, myOption.rect, text); //如果当前有焦点,就绘制一个焦点矩形,否则什么都不做 drawFocus(painter, myOption, myOption.rect); } else{ //否则默认 QItemDelegate::paint(painter, option, index);
4. { 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. } } } //如果没有控件选中,调用默认委托 else { QStyledItemDelegate::paint(painter, option, index); starRating.paint(painter, option.rect, option.palette, StarRating::ReadOnly); //如果某项数据是星星类型 if (qVariantCanConvert<StarRating>(index.data())) { //获取该项数据,并转换成 StarRating 类型 StarRating starRating = qVariantValue<StarRating>(index.data()); //如果有控件被选中,我们就让选中的控件变亮 if (option.state & QStyle::State_Selected) painter->fillRect(option.rect, option.palette.highlight());
//否则调用默认委托 QStyledItemDelegate::paint(painter, option, index);
3、实现在 QTableView 中绘制 QCheckBox
Java 代码
1. #include <QtGui> 2. #include <QItemDelegate> 3. #include <QStyleOptionProgressBarV2> 4. #include "DelReconQueue.h" 5. //重载绘制函数 6. void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &o ption, 7. 8. { 9. 10. 11. 12. (); 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. } } else { checkBoxOption->state |= QStyle::State_Off; //按钮的风格选项 QStyleOptionButton *checkBoxOption = new QStyleOptionButton(); checkBoxOption->state |= QStyle::State_Enabled; //根据值判断是否选中 if(checked) { checkBoxOption->state |= QStyle::State_On; if (index.column() == 11) { //获取值 bool checked = index.model()->data(index, Qt::DisplayRole).toBool const QModelIndex &index) const
2、实现在 QTableView 中绘制进度条
Cpp 代码
1. //重载绘制函数 2. void DelReconQueue::paint(QPainter *painter, const QStyleOptionViewItem &o ption, 3. 4. { 5. 6. 7. 8. 9. 10. oInt(); 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. //进度条的风格选项 QStyleOptionProgressBarV2 *progressBarOption = new QStyleOptionPro gressBarV2(); progressBarOption->rect = option.rect; progressBarOption->minimum = 0; progressBarOption->maximum = subTaskNum; progressBarOption->progress = finishedSubTaskNum; int t = finishedSubTaskNum/subTaskNum; progressBarOption->text = QString::number(t) + "%"; int subTaskNum = itemModel->data(itemModel->index(index.row(), 8), Qt::DisplayRole).toInt(); //如果是'已经完成子任务数' if (index.column() == 9) { const QAbstractItemModel *itemModel = index.model(); //获得索引对应 Model 中的数据 int finishedSubTaskNum = itemModel->data(index, Qt::DisplayRole).t const QModelIndex &index) const
else { //否则调用默认委托 QStyledItemDelegate::paint(painter, option, index);
//生成 QCheckBox
ቤተ መጻሕፍቲ ባይዱCpp 代码
1. QRect DgSystemLog::CheckBoxRect(const QStyleOptionViewItem &viewItemStyleO ptions)const 2. { 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. } //绘制按钮所需要的参数 QStyleOptionButton checkBoxStyleOption; //按照给定的风格参数 返回元素子区域 QRect checkBoxRect = QApplication::style()->subElementRect( QStyle::SE _CheckBoxIndicator, &checkBoxStyleOption); //返回 QCheckBox 坐标 QPoint checkBoxPoint(viewItemStyleOptions.rect.x() + viewItemStyleOpti ons.rect.width() / 2 - checkBoxRect.width() / 2, viewItemStyleOptions.rect.y() + viewItemStyleOpti ons.rect.height() / 2 - checkBoxRect.height() / 2); //返回 QCheckBox 几何形状 return QRect(checkBoxPoint, checkBoxRect.size());
25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. } } }
//返回 QCheckBox 几何形状 checkBoxOption->rect = CheckBoxRect(option); //绘制 QCheckBox QApplication::style()->drawControl(QStyle::CE_CheckBox,checkBoxOpt ion,painter);
4、实现在 QTableView 中绘制自定义类 星星
Cpp 代码
1. //重载绘制函数 2. void StarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op tion, 3. const QModelIndex &index) const
4. { 5. 6. 7. 8. 9. (); 10. 11. ')); 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 23. 24. 25. 26. 27. 28. } } } { //否则调用默认委托 QStyledItemDelegate::paint(painter, option, index); 22. else //获取项风格设置 QStyleOptionViewItem myOption = option; myOption.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; //绘制文本 QApplication::style()->drawItemText ( painter, myOption.rect , myOptio n.displayAlignment, QApplication::palette(), true,text ); //设置'病人 Id'格式字符串: P:00000x;6 位 10 进制数,不足补 0; QString text = QString("P:%1").arg(patientId, 6, 10, QChar('0 //如果是第 2 列'病人 Id' if (index.column() == 2) { //获得当前项值 int patientId = index.model()->data(index, Qt::DisplayRole).toInt