QT开发中文网

this->setItemDelegate(new ButtonDelegate());设置完自定义视图项代理后,QTreeWidgetItem的qss不生效

在使用自定义视图项代理(QAbstractItemDelegate 或其子类)时,通常会覆盖 QTreeWidgetItem 的样式。因此,QSS 可能不会生效,因为代理负责绘制该项的外观,而不是使用默认的绘制方法。

解决方案

如果你希望在自定义代理中同时使用 QSS 样式和自定义绘制,可以遵循以下步骤:

  1. 在代理中实现绘制方法:如果你正在使用一个自定义的 item delegate 来控制如何绘制项目,你需要确保你的 paint() 方法在适当的位置调用了基础类的 paint() 方法,以便能够应用 QSS 样式。

  2. 设置样式:可以通过重写 sizeHint()paint() 方法来实现对样式的支持。在 paint() 中,首先获取样式,然后按照需要来渲染控件。

示例代码

以下是如何创建一个简单的自定义代理,并将 QSS 应用到 QTreeWidgetItem 的示例:

#include <QApplication>
#include <QTreeWidget>
#include <QStyledItemDelegate>
#include <QPainter>

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

    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {
        // 使用父类的方法处理基本绘制
        QStyledItemDelegate::paint(painter, option, index);

        // 在此处进行额外绘制或修改,如按钮等
        if (index.data().isValid()) {
            // 绘制逻辑...
            painter->drawText(option.rect, Qt::AlignLeft, index.data().toString());
        }
    }

    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override {
        return QStyledItemDelegate::sizeHint(option, index);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    
    QTreeWidget tree;
    tree.setColumnCount(1);
    tree.setHeaderLabel("示例树");

    // 添加一些数据
    for (int i = 0; i < 10; ++i) {
        auto *item = new QTreeWidgetItem(&tree);
        item->setText(0, QString("项 %1").arg(i));
        
        // 设置每个项的数据,这里用于演示
        item->setData(0, Qt::DisplayRole, QString("数据 %1").arg(i));
    }

    // 设置自定义代理
    tree.setItemDelegate(new ButtonDelegate());

    // 应用样式表
    tree.setStyleSheet("QTreeWidget { background-color: #f0f0f0; }"
                       "QTreeWidget::item { border: 1px solid #ccc; padding: 5px; }");
                       
    tree.resize(400, 300);
    tree.show();

    return app.exec();
}

注意事项

  • 上面的代码展示了如何将委托与样式结合。请注意,在 paint() 方法中,我们调用了父类的 paint() 函数,从而确保可以利用基础样式和其他选项。

  • 确保您的对象上有适当的可设置的属性,以使您添加的新功能正常工作。比如按钮颜色、字体等,应根据您希望使用 QSS 自定义它们。

  • 最后,请根据您的具体需求定制按钮和项目呈现逻辑。这只是一个基本框架,可以扩展以满足您的要求。


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

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

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

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

    联系我们

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

    微信号:3007537140

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

    关注我们
    x

    注册

    已经有帐号?