关于使用QListView向模型插入第一条数据的相关问题

在使用QListView的时候,看着它的四个尖角不爽,想着让它变成圆角矩形吗,但麻烦就接踵而至了。。。

在向其中插入第一条数据的时候发现,你插入的一条数据它存在边界超过QListView的现象。如下图所示:

这就令人头大了,思来想去打算用以前的老办法:直接插入一条空项,结果如上图所示。

后来又想着让QLIstView中的第一项QStandardItem不接受鼠标事件:

#include <QApplication>
#include <QListView>
#include <QHoverEvent>
#include <QStandardItemModel>
#include <QDebug>

class EventFilter : public QObject
{
public:
    explicit EventFilter(QObject* parent = nullptr) : QObject(parent) {}

protected:
    bool eventFilter(QObject* obj, QEvent* event) override
    {
        //qDebug() << "Event received by object:" << obj <<
        //    "Event type:" << event->type();
        if (event->type() == QEvent::HoverEnter ||
            event->type() == QEvent::HoverMove ||
            event->type() == QEvent::HoverLeave) {
            QListView* view = qobject_cast<QListView*>(obj->parent()); // Use parent() to get the QListView
            if (view) {
                QHoverEvent* hoverEvent = static_cast<QHoverEvent*>(event);
                QModelIndex index = view->indexAt(hoverEvent->position().toPoint());
                if (index.isValid() && index.row() == 0) {
                    //qDebug() << "Hover on item:" << index.row();
                    // Handle hover event here
                    hoverEvent->ignore();
                     // If you want to stop event propagation
                }
                else qDebug() << "Hover on item:" << index.row();
                return true;
            } else {
                qDebug() << "Failed to cast to QListView";
            }
        }
        return QObject::eventFilter(obj, event);
    }
};

int main(int argc, char* argv[]) {
    QApplication a(argc, argv);

    QStandardItemModel model;
    QListView listView;
    listView.setModel(&model);
    for (int i = 0; i < 10; ++i) {
        QStandardItem* item = new QStandardItem(QString("Item %1").arg(i));
        model.appendRow(item);
    }
    listView.setMouseTracking(true); // Enable mouse tracking
    listView.viewport()->setAttribute(Qt::WA_Hover); // Enable hover events

    EventFilter* filter = new EventFilter(&listView);
    listView.viewport()->installEventFilter(filter);

    listView.show();
    return a.exec();
}

结果照旧。。。真的服了。。。

然后又想着让他不可被选中也不可交互:

auto item = new QStandardItem();
item->setEnabled(false);
item->setSelectable(false);

没用,还是没用只要鼠标一旦移到第一项上面它就会出现背景色。。。

再之后又想着直接设置flag:

item->setFlags(Qt::NoItemFlags);

不出所料的还是错了。

忍不了了直接设置代理,或许一开始插入空项就是错的。。

class CustomDelegate : public QStyledItemDelegate {
public:
    CustomDelegate(QObject* parent = nullptr) : QStyledItemDelegate(parent) {}

    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override {
        QStyleOptionViewItem modifiedOption = option;
        if (index.row() == 0) {
            modifiedOption.rect.adjust(0, 20, 0, 0); // 向下偏移20像素
        }
        QStyledItemDelegate::paint(painter, modifiedOption, index);
    }

    QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override {
        QSize size = QStyledItemDelegate::sizeHint(option, index);
        if (index.row() == 0) {
            size.setHeight(size.height() + 20); // 增加高度以适应偏移
        }
        return size;
    }
};

问题解决,畅快~~~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值