【问题标题】:QPushButton not blinkingQPushButton 不闪烁
【发布时间】:2019-09-19 13:39:35
【问题描述】:

受到Label on QToolBar, possible? 的启发,我正在尝试开发它。但是我的按钮在点击时不闪烁,为什么?

我在另一个应用程序中看到,在单击期间(按下时)按钮颜色变灰,而普通按钮变蓝。但是我的按钮只是一个图像,在点击过程中没有任何行为。

左侧是使用QAction(上面链接的问题)的工具栏,右侧是下面的代码。

QApplication a(argc, argv);
QMainWindow w;

QToolBar barA;
barA.setToolButtonStyle(Qt::ToolButtonTextUnderIcon);

QWidget widget;
QVBoxLayout vLayout(&widget);

QHBoxLayout hLayout;
vLayout.addLayout(&hLayout);

QPixmap pixmap("../../../on.png");
QIcon ButtonIcon(pixmap);

QPushButton bt;
bt.setIcon(ButtonIcon);
bt.setIconSize(QSize(32,32));
bt.setFixedSize(QSize(32,32));
bt.show();
hLayout.addWidget(&bt);

barA.addWidget(&widget);

QPushButton bt2("clickc");
barA.addWidget(&bt2);

w.addToolBar(&barA);

w.show();
return a.exec();

【问题讨论】:

  • 在哪里实现了点击的“关闭”行为?我在您的代码中没有看到它,但在您链接的示例中很明显。
  • 右侧应用程序中没有Off,它引用了此问题中显示的代码。左侧的应用程序指的是另一个问题。我尝试在单击此处比较按钮行为。

标签: qt c++11 qt5 qpushbutton qtoolbar


【解决方案1】:

做一些类似的事情:

auto b = new QPushButton(this);
b->setText("hello");
connect(b, &QPushButton::clicked, [](){qDebug()<< "ok...";});
ui->statusBar->addWidget(b);

【讨论】:

  • 我知道这应该显示按钮正在接收点击。虽然我想知道为什么它不闪烁,但我可能会说缺少视觉反馈。
  • ummm...点击信号被触发了吗??
  • @KcFnMi 你没有实现它。原始问题确实如此,通过 QAction 为两种状态分配图像。可以通过 QSS 来代替,通过在样式表中为两个不同的状态选择器分配图像
【解决方案2】:

不过还是会害羞地眨眼,不如左侧应用中的那个。

按钮.h

#include <QPushButton>

class Button : public QPushButton {
    Q_OBJECT
    QPixmap m_pixmap;
public:
    explicit Button(QString img, QWidget *parent = nullptr);
public slots:
    void enable();
    void disable();
};

#endif // BUTTON_H

按钮.cpp

#include "button.h"

Button::Button(QString img, QWidget *parent) : QPushButton(parent) {
    setIcon(QIcon(img));
    setIconSize(QSize(32,32));
    setFixedSize(QSize(32,32));

    connect(this, &QPushButton::pressed, this, &Button::disable);
    connect(this, &QPushButton::released, this, &Button::enable);
}

void Button::enable(){
    setIcon(m_pixmap);
}

void Button::disable(){
    m_pixmap = icon().pixmap(32,32,QIcon::Normal);
    QPixmap pixmap = icon().pixmap(32,32,QIcon::Selected);
    setIcon(pixmap);
}

【讨论】:

  • 您的QIcon 是否真的添加了Selected 模式文件?因为我看不到你在哪里做的(QIcon::addFile())。所以交换图标根本不应该有任何影响。我认为您只是在按钮上看到默认的 Mac 样式行为。
【解决方案3】:

您应该查看文档: https://doc.qt.io/qt-5/stylesheet-examples.html

你可能只需要在上面设置样式表。

QToolButton:pressed { }

我在这里做一个假设,但工具栏可能已经有一个样式表来处理您观察到的颜色变化。

【讨论】:

  • 停止使用连接的给定理由不在这里(并且它不是启用/禁用小部件,只是使用图标进行调整)。无论如何,我很好奇如何在没有连接的情况下实现类似的结果?
  • 连接不好,我读得太快了。同样,我很确定您想要实现的目标可以通过样式表完成 :)
【解决方案4】:

使用QToolButton 显示QActions 的左侧工具栏将具有特殊的QMacStyle 样式应用于向下/按下状态。 https://code.woboq.org/qt5/qtbase/src/plugins/styles/mac/qmacstyle_mac.mm.html#3538(更具体地说是here,它调用darkenPixmap()

最简单的解决方案似乎是使用 QToolButton 或仅使用 QAction 路由(无论如何,操作比按钮更灵活,您可以在不同的 UI 元素中多次使用它们)。

否则,如果您专门为Selected 模式将文件添加到QIcon,则您在“仍然害羞眨眼”答案中发布的代码应该可以工作。或者只使用两个图标并在它们之间交换(看起来更容易)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多