Qt自定义委托在QTableView中绘制控件、图片、文字
- 格式:docx
- 大小:133.42 KB
- 文档页数:9
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 例子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用法总结一、创建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中显⽰图⽚和⽂字的⽅法思路⾮常简单:<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实现在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-⾃定义委托全家桶⼀、功能特点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是一款广泛使用的跨平台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控件⼀.说明: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思路: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)⼤功告成我只是把核⼼代码写下来了,别的花⾥胡哨的添加⾃⼰写...。