QT开发中文网

void CProjectList::paintEvent(QPaintEvent* event) { // 先调用父类的绘制函数 QTreeView::paintEvent(event); // 绘制自定义style为true的action的背景颜色 QPainter painter(viewport()); for (QAction* action : menu->actions()) { if (action->propert...

你可以尝试以下代码来优化你的paintEvent函数,实现鼠标滑过和鼠标点击时的样式:

void CProjectList::paintEvent(QPaintEvent* event)
{
    // 先调用父类的绘制函数
    QTreeView::paintEvent(event);

    QPainter painter(viewport());
    for (QAction* action : menu->actions()) {
        if (action->property("customStyle").toBool()) {
            QRect rect = visualRect(indexAt(QPoint(0, 0)));

            // 获取鼠标状态
            bool isHovered = action->data().toBool();
            bool isChecked = action->isChecked();

            // 设置背景颜色和字体颜色
            QColor bgColor;
            QColor textColor;

            if (isChecked) {
                bgColor = QColor("#3F7AFF");
                textColor = QColor("#F2F6FF");
            } else if (isHovered) {
                bgColor = QColor("#4C83FF");
                textColor = Qt::black;
            } else {
                continue;  // 非激活状态无需绘制
            }

            painter.fillRect(rect, bgColor);  // 设置背景颜色

            QString text = action->text();
            
             // 绘制文本
             painter.setPen(textColor);
             painter.drawText(rect, Qt::AlignCenter, text);
        }
    }
}

在设置菜单项时,添加相应的信号槽连接以更新自定义属性值:

QAction* addAction = menu->addAction("添加样品", this, &CProjectList::slotAddItemInTreeSample);
connect(addAction, SIGNAL(hovered()), this, SLOT(actionHovered()));
connect(addAction, SIGNAL(toggled(bool)), this, SLOT(actionToggled(bool)));

然后,在CProjectList类中添加槽函数来处理鼠标悬停和选中状态变化的信号:

void CProjectList::actionHovered()
{
    QAction* action = qobject_cast<QAction*>(sender());
    if (action) {
        action->setData(true);
        viewport()->update();  // 更新绘制
    }
}

void CProjectList::actionToggled(bool checked)
{
    QAction* action = qobject_cast<QAction*>(sender());
    if (action) {
        action->setData(false);
        action->setChecked(checked);
        viewport()->update();  // 更新绘制
    }
}

这样就可以实现鼠标滑过和鼠标点击时的不同样式了。如果有其他问题,请随时提问。


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

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=9907

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?