- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个自定义标题 QProduitCartoHeaderView
在继承自 QHeaderView
的类中定义.
在我的标题中,我有一个复选框用于选中/取消选中同一列中的所有复选框
对于所有数据行。
目前,当我单击第一列(带复选框的)的标题单元格中的任意位置时,
它检查标题复选框。
我想做的是仅在单击 时选中复选框。正好在它上面,如果我单击外部( 但仍在单元格内 )对第一列进行排序。
我试图调整复选框矩形的大小(如下面的片段中的 QProduitCartoHeaderView::paintSection()
所示),但是当我单击单元格中的任意位置( 不在复选框 上)时,我仍然对其进行了检查。
注意:我已经设法使代码进行排序和检查。我不能做的是检查
无论我是点击复选框还是在单元格内的复选框之外。
这是我的自定义标题的片段:
#ifndef QPRODUITCARTOHEADERVIEW_H
#define QPRODUITCARTOHEADERVIEW_H
#include <QWidget>
#include <QPainter>
#include <QHeaderView>
#include <QMessageBox>
class QProduitCartoHeaderView :public QHeaderView
{
Q_OBJECT
public:
QProduitCartoHeaderView(QWidget * parent = 0);
~QProduitCartoHeaderView();
void on_sectionClicked(int logicalIndex);
bool all_first_columns_checked(int logicalIndex = 0);
bool all_first_columns_unchecked(int logicalIndex=0);
void setIsOn(bool val);
void setPasTousLesMeme(bool val);
protected:
virtual void paintSection(QPainter* poPainter, const QRect & oRect, int index) const;
virtual void mouseReleaseEvent(QMouseEvent *e);
private:
bool isOn = false, pasTousLesMeme = false;
signals:
void dataModifiedSig();
};
#endif
#ifndef QPRODUITCARTOHEADERVIEW_H
#include "QProduitCartoHeaderView.h"
#endif
#ifndef QPRODUITCARTODATAMODEL_H
#include "QProduitCartoDataModel.h"
#endif
QProduitCartoHeaderView::QProduitCartoHeaderView(QWidget* parent) : QHeaderView(Qt::Horizontal, parent)
{
}
QProduitCartoHeaderView::~QProduitCartoHeaderView()
{
}
void QProduitCartoHeaderView::setIsOn(bool val)
{
isOn = val;
}
void QProduitCartoHeaderView::setPasTousLesMeme(bool val)
{
//set if all checkboxes have different value or not
pasTousLesMeme = val;
}
void QProduitCartoHeaderView::paintSection(QPainter* poPainter, const QRect & oRect, int index) const
{
poPainter->save();
QHeaderView::paintSection(poPainter, oRect, index);
poPainter->restore();
QStyleOptionButton option;
QRect checkbox_rect = style()->subElementRect(QStyle::SE_CheckBoxIndicator, &option);
checkbox_rect.moveCenter(oRect.center());
// pour la colonne 1
if (index == 0)
{
qDebug() << checkbox_rect << " -- " << oRect;
// position
option.state = QStyle::State_Enabled | QStyle::State_Active;
option.rect = checkbox_rect;
QHeaderView::paintSection(poPainter, checkbox_rect, index);
if (isOn)
{
// on a tout coché
option.state |= QStyle::State_On;
}
else
{ // traite pas tout coché
// on rajoute le troisième état (third state)
// quand on n'a pas tout coché mais pas tout décoché non plus
if ( pasTousLesMeme )
{
option.state |= QStyle::State_NoChange;
}
else
{
// et si on a tout décoché, on décoche (isOn = false et pasTouslesMemes=false)
option.state |= QStyle::State_Off;
}
}
// on redessine alors la checkbox
this->style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &option, poPainter);
}
}
void QProduitCartoHeaderView::mouseReleaseEvent(QMouseEvent *e)
{
QHeaderView::mouseReleaseEvent(e);
}
bool QProduitCartoHeaderView::all_first_columns_checked(int logicalIndex)
{
//code to check if all first colum is checked
}
bool QProduitCartoHeaderView::all_first_columns_unchecked(int logicalIndex)
{
//code to check if all first colum is unchecked
}
void QProduitCartoHeaderView::on_sectionClicked(int logicalIndex)
{
// code pour le click du header contenant les checkboxes
QProduitCartoDataModel* the_Model = (QProduitCartoDataModel*) this->model();
if (logicalIndex == 0)
{
// on update l'état du checkbox principale (si isOn = true, la checkbox est cochée)
if (isOn)
{
// si elle est cochée, on la met à false (pour flip/flop)
isOn = false;
// mais si tout est décoché, alors, on met la checkbox à false
if (all_first_columns_unchecked(logicalIndex))
{
isOn = true;
}
}
else
{
isOn = true;
if (all_first_columns_checked(logicalIndex))
{
isOn = false;
}
}
this->update();
// fin update
int nbRow = this->model()->rowCount();
// on met tout à false si la majorité est à true
int nbTrue = 0;
if (all_first_columns_checked(logicalIndex))
{
for (int r = 0; r < nbRow; r++)
{
QModelIndex index = this->model()->index(r, logicalIndex);
the_Model->setData(index, false, Qt::CheckStateRole);
}
}
else
{
// on efface d'abord tout
for (int r = 0; r < nbRow; r++)
{
QModelIndex index = this->model()->index(r, logicalIndex);
bool checked = this->model()->data(index, Qt::DisplayRole).toBool();
if (checked)
the_Model->setData(index, false, Qt::CheckStateRole);
}
// Ensuite, on fait le flip/flop
for (int r = 0; r < nbRow; r++)
{
QModelIndex index = this->model()->index(r, logicalIndex);
// update each row of real data
the_Model->setData(index, true, Qt::CheckStateRole);
}
}
}
emit dataModifiedSig();
}
最佳答案
您可以跟踪鼠标并重新实现mousePressEvent(QMouseEvent *event)
和 mouseReleaseEvent(QMouseEvent *event)
以确定单击该部分的位置。我在下面创建了一个示例:
myheaderview.h
#ifndef MYHEADERVIEW_H
#define MYHEADERVIEW_H
#include <QHeaderView>
class MyHeaderView : public QHeaderView
{
public:
MyHeaderView(QWidget *parent = nullptr);
QRect visualRectOfColumn(int column) const;
protected:
virtual void paintSection(QPainter *painter, const QRect &rect, int index) const;
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
private:
int press_column_{-1};
bool checkbox_pressed_{false};
};
#endif // MYHEADERVIEW_H
myheaderview.cpp
#include "myheaderview.h"
#include <QPainter>
#include <QMouseEvent>
#include <QDebug>
MyHeaderView::MyHeaderView(QWidget *parent) : QHeaderView(Qt::Horizontal, parent)
{
this->setMouseTracking(true);
}
QRect MyHeaderView::visualRectOfColumn(int column) const
{
int x = sectionViewportPosition(column);
int y = 0;
int h = this->height();
int w = this->sectionSize(column);
return QRect(x, y, w, h);
}
void MyHeaderView::paintSection(QPainter *painter, const QRect &rect, int index) const
{
painter->save();
QHeaderView::paintSection(painter, rect, index);
painter->restore();
if (index == 0)
{
QStyleOptionButton option;
QRect checkbox_rect = style()->subElementRect(QStyle::SE_CheckBoxIndicator, &option);
checkbox_rect.moveCenter(rect.center());
option.state = QStyle::State_Enabled | QStyle::State_Active;
option.rect = checkbox_rect;
QHeaderView::paintSection(painter, checkbox_rect, index);
this->style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &option, painter);
}
}
void MyHeaderView::mousePressEvent(QMouseEvent *event)
{
press_column_ = this->visualIndexAt(event->pos().x());
if (press_column_ == -1)
{
checkbox_pressed_= false;
return QHeaderView::mousePressEvent(event);;
}
QStyleOptionButton option;
QRect checkbox_rect = style()->subElementRect(QStyle::SE_CheckBoxIndicator, &option);
checkbox_rect.moveCenter(this->visualRectOfColumn(press_column_).center());
checkbox_pressed_= checkbox_rect.contains(event->pos());
QHeaderView::mousePressEvent(event);
}
void MyHeaderView::mouseReleaseEvent(QMouseEvent *event)
{
int release_column = this->visualIndexAt(event->pos().x());
if (release_column != -1 && press_column_ == release_column)
{
if (release_column != 0)
qDebug() << "sort";
else
{
QStyleOptionButton option;
QRect checkbox_rect = style()->subElementRect(QStyle::SE_CheckBoxIndicator, &option);
checkbox_rect.moveCenter(this->visualRectOfColumn(release_column).center());
if (checkbox_pressed_&& checkbox_rect.contains(event->pos()))
qDebug() << "checkbox";
else if (!checkbox_pressed_&& !checkbox_rect.contains(event->pos()))
qDebug() << "sort";
}
}
press_column_ = -1;
checkbox_pressed_= false;
QHeaderView::mouseReleaseEvent(event);
}
关于c++ - 带复选框的 QHeaderView - 如何区分单击标题复选框与单击单元格中的任意位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64440913/
不确定是否可能,但只是想知道 CSS 中是否有一种方法来区分两种浏览器,即 IE6 和 IE8,因为我有一个我需要应用的样式,但 IE6 和 IE8 的值需要不同,即 ul.sf-menu li li
我正在为 C 库编写 C++ 抽象。 C 库有几个用于标识远程资源的 ID 的类型定义: typedef int color_id; typedef int smell_id; typedef int
有谁知道当以编程方式遍历 Word 文档时,您可以判断一个段落是否构成目录的一部分(或者实际上,构成字段一部分的任何其他内容)。 我提出这个问题的原因是我有一个 VB 程序,它应该从文档中提取前几段实
假设我的数据集包含三列:id(标识)、case(字符)和 value(数字)。这是我的数据集: tdata <- data.frame(id=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4
我在解释 gcc (4.8.2) 警告和错误时遇到问题。更准确地说,很难分辨一个问题在哪里结束,另一个问题从哪里开始。我只能通过控制台访问构建机器,因此不能选择使用 IDE。 我真的需要能够快速区分个
我想创建一个泛型类型,它只从类定义中选择修饰的方法。 function test(ctor: any, methodName: any) {} class A { @test publ
是否有规范的 base-R 方法来确定函数参数是否是对象名称而不是文字/表达式? 虽然通常不鼓励使用 NSE,但偶尔会有人有一个好主意并想使用它。 data.frame 是我认为“方便”的最简单用例:
我已经实现了 didSelectRowAtIndexPath 和accessoryButtonTappedForRowWithIndexPath 似乎永远不会触发。但是,didSelectRowAtI
我需要确定数据框中的哪些列是小数,哪些是字符串。 使用 df.dtypes 为两种列类型提供“对象”: import pandas as pd import decimal data = {'dec1
有没有办法在 Vim 中区分隐藏缓冲区和事件缓冲区? 我需要确定窗口中的缓冲区是否处于事件状态,以便可以切换它。 尝试了 bufloaded、bufexists 和 buflisted,但它们对于事件
在 JavaScript 中区分事件的最佳方法是什么。 实际上有两点我感兴趣。第一点是事件中是否有类似 id 的东西(这对于调试目的非常有用)。另一点是有更好的方法来区分 mousedown 和 mo
我有一个 php 页面,里面有多个表单。 "> "> " value=""> " value=""> 这些表单是通过循环遍历 MySQL 上的所有数据而生成的。每个表单和输入都
Pony 有一个未参数化的异常值。 不幸的是,我经常有一些代码想要抛出不同类型的异常,并且我需要知道它们是什么,以便正确处理它们——例如,简单地说,当停止程序时,向用户提供以下信息很重要正确的错误消息
出于对所有神圣事物的热爱,您如何区分预定义的 .NET 异常类中的不同“异常风格”? 例如,一段代码可能会抛出 XmlException在以下条件下: 文档的根元素为NULL 文档中的字符无效 文档太
正如您在下面看到的,我创建了一个 JComboBox,其中“选项”数组中的元素作为列表中的选项。 当选择列表中的特定项目时,我想显示 JLabels“一个”或“两个”。例如。选择选项一显示“一”,选择
我有一个表,其中包含四列用户名、产品名称、产品价格和一个名为 item_paid 的 boolean 列。相同的产品名称可以作为重复条目插入到表中。但是有没有办法区分一行和重复行?或者我应该创建一个名
是否可以使用反射来区分仅 getter 属性和表达式主体属性? class MyClass { DateTime GetterOnly { get; } DateTime Expres
我即将为一个学校项目制作一个小程序,该程序应该能够识别通过 MIDI 钢琴输入演奏的和弦(这只是其中的一部分)。 目前为止,每次按下和每次释放 MIDI 键盘上的某个键,我都会得到一个 ShortMe
我正在使用“自动”反序列化器从 Kafka 消费 Avro 序列化消息,例如: props.put( ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFI
我需要从两个表中检索数据。第一个是事件列表,第二个是 field 列表。 我在两个表中都有一个同名的字段:events.venue(这是一个 ID),venues.venue 是地点的名称,比如“bl
我是一名优秀的程序员,十分优秀!