QT开发中文网

qlistview特定项上添加删除按钮

QListView 中为特定项添加删除按钮,可以通过自定义模型和委托来实现。这里的思路是使用一个自定义的 QStyledItemDelegate,重写绘制和事件处理方法,以便在特定项上绘制删除按钮。

以下是一个示例代码,展示如何为 QListView 的特定项添加删除按钮:

示例代码

#include <QApplication>
#include <QListView>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QPainter>

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

    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {
        // 绘制默认内容
        QStyledItemDelegate::paint(painter, option, index);

        // 如果是特定项(例如:第二项),绘制删除按钮
        if (index.row() == 1) {  // 在这里指定需要显示按钮的项
            QRect buttonRect(option.rect.x() + option.rect.width() - 60, option.rect.y() + 5, 50, option.rect.height() - 10);
            painter->drawText(buttonRect, Qt::AlignCenter, "Delete");
        }
    }

    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override {
        return QSize(option.rect.width(), 30); // 控制每一行的高度
    }
};

class MainWindow : public QWidget {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);

private slots:
    void onDeleteButtonClicked(int row);

private:
    QListView *listView;
    QStandardItemModel *model;
};

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent), listView(new QListView(this)), model(new QStandardItemModel(this)) {

    setFixedSize(300, 400);
    
    // 添加一些示例项目
    for (int i = 0; i < 10; ++i) {
        QString itemText = QString("Item %1").arg(i);
        model->appendRow(new QStandardItem(itemText));
    }

    listView->setModel(model);
    
    // 设置自定义代理
    CustomDelegate *delegate = new CustomDelegate(this);
    listView->setItemDelegate(delegate);
    
   // 用于点击事件识别
   listView->setMouseTracking(true); 
}

void MainWindow::onDeleteButtonClicked(int row) {
   if(row >= 0 && row < model->rowCount()) {
       model->removeRow(row);   // 删除指定行的数据
       listView->update();       // 更新列表视图
   }
}

void MainWindow::mousePressEvent(QMouseEvent *event) {
     QModelIndex index = listView->indexAt(event->pos());
     if (index.isValid()) {
         QRect buttonRect(index.rect().x() + index.rect().width() - 60,
                          index.rect().y() + 5,
                          50,
                          index.rect().height() - 10);
         
         if (buttonRect.contains(event->pos())) { 
             onDeleteButtonClicked(index.row()); 
         }
     }
}

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

   MainWindow window;
   window.show();

   return app.exec();
}

#include "main.moc"

功能说明:

  1. CustomDelegate: 创建了一个自定义委托类,用于重载 paint() 方法。在该方法中,我们绘制了默认的列表项,并在特定条件下(此处为第二项)绘制一个“删除”文本作为按钮。

  2. 鼠标事件处理: 在主窗口中,我们重载了 mousePressEvent() 方法,用于检测用户是否点击了“删除”区域。如果点击的位置在对应的“删除”按钮内,则调用相应的方法进行删除操作。

  3. MainWindow: 初始化模型并将其设置到 QListView 上,同时设置我们创建的自定义代理。

注意事项:

  • 此示例中的“删除”文本只是简单地被当作标签,而不是实际的 QPushButton。若要使其更具交互性,可以考虑使用真实的 QPushButton,但这会增加复杂性。
  • 您可以根据具体需求更改条件以显示不同项上的按钮,只需调整 if (index.row() == ...) 条件即可。

希望这个示例对你有所帮助!如果有其他问题,请随时询问。


内容由零声教学AI助手提供,问题来源于学员提问

目录导航
  • 示例代码
  • 功能说明:
  • 注意事项:
  • 本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
    转载请注明出处:https://qt.0voice.com/?id=13185

    分享:
    扫描分享到社交APP
    上一篇
    下一篇
    发表列表
    游客 游客
    此处应有掌声~
    评论列表

    还没有评论,快来说点什么吧~

    联系我们

    在线咨询: 点击这里给我发消息

    微信号:3007537140

    上班时间: 10:30-22:30

    关注我们
    x

    注册

    已经有帐号?