在使用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;
}
};
问题解决,畅快~~~