调用setDown时,QPushButton不会更新

时间:2017-07-23 15:37:31

标签: c++ qt

我有一个QPushButton,我想把它推进去#34;所以我打电话给

btn->setDown(true);

但是这并没有更新按钮的外观或行为(它仍然被提升,可以按下)。

当我从一般函数调用该命令时会发生这种情况,但是当我按下一个被按下时触发的函数(通过将slot绑定到其clicked() { {1}})。

如预期的那样,属性signal的值为true,但行为不匹配。缺少什么?

3 个答案:

答案 0 :(得分:0)

我做了你在MCVE中描述的内容。 (严格来说:我这样做是因为我理解你所描述的......)

这是我的样本testQPushButtonSetDown.cc

// Qt header:
#include <QtWidgets>

#if QT_VERSION_MAJOR < 5
#define USE_OLD_SIGNAL_SLOT
#endif // QT_VERSION_MAJOR < 5

#ifdef USE_OLD_SIGNAL_SLOT
#include "PushButton.h"
#else // (not) USE_OLD_SIGNAL_SLOT
#define PushButton QPushButton
#endif // USE_OLD_SIGNAL_SLOT

int main(int argc, char **argv)
{
  qDebug() << QT_VERSION_STR;
  // main application
#undef qApp // undef macro qApp out of the way
  QApplication qApp(argc, argv);
  qDebug() << QApplication::style()->objectName();
  // setup GUI
  QWidget qWin;
  QHBoxLayout qBox;
  QCheckBox qTglBtn(QString::fromUtf8("Force Button Down"));
  qBox.addWidget(&qTglBtn);
  PushButton qBtn(QString::fromUtf8("A Button"));
  qBtn.setFocusPolicy(Qt::StrongFocus); // requirement of OP
  qBox.addWidget(&qBtn);
  qWin.setLayout(&qBox);
  qWin.show();
  // install signal handlers
#ifdef USE_OLD_SIGNAL_SLOT
  QObject::connect(&qTglBtn, SIGNAL(toggled(bool)),
    &qBtn, SLOT(setDown(bool)));
#else  // (not) USE_OLD_SIGNAL_SLOT
  QObject::connect(&qTglBtn, &QCheckBox::toggled,
    &qBtn, &PushButton::setDown);
#endif // USE_OLD_SIGNAL_SLOT
  // run application
  return qApp.exec();
}

标题文件PushButton.h以覆盖Qt 4的QPushButton

#ifndef PUSH_BUTTON_H
#define PUSH_BUTTON_H

#include <QPushButton>

class PushButton: public QPushButton {
  Q_OBJECT
  public:
    PushButton(const QString &label, QWidget *pQParent = nullptr):
      QPushButton(label, pQParent)
    { }
  public slots:
    void setDown(bool down) { QPushButton::setDown(down); }
};

#endif // PUSH_BUTTON_H

注意:

不幸的是,QPushButton::setDown()不是一个时隙,因此不能像Qt 4那样在信号中使用。因此,PushButton仅来自QPushButton,只能使setDown()成为一个广告位。

我在VS2013中编译并在Windows 10(64位)上进行了测试。

Snapshot of testQPushButtonSetDown (button not forced down)

Snapshot of testQPushButtonSetDown (button forced down)

它看起来像预期的那样。

我看起来不像&#34;按钮已关闭。&#34;但这是他在我的Windows 10上呈现的方式,默认的Qt风格("windowsvista")模仿了Windows的外观和感觉。至少,当切换复选框时,您可以看到按钮的可见更改。除此之外,它还具有鼠标点击按钮时的精确外观。

注意:

致电QPushButton::setDown()不会发出pressed()clicked()信号。

来自Qt doc。 (由我强调):

  

如果此属性为true,则按下该按钮。如果将此属性设置为true,则信号pressed()和clicked()不会发出

如果是这样,则必须使用其他方法:QPushButton::click()

这在Qt doc中有所描述。 QAbstractButton的{(QPushButton中继承的):

  

QAbstractButton提供了四个信号:

     
      当鼠标光标位于按钮内时,按下鼠标左键时会发出
  1. pressed()。

  2.   释放鼠标左键时会发出
  3. released()。

  4.   首次按下然后释放按钮,键入快捷键,或clicked()或click()时,会发出
  5. animateClick()调用。

  6.   当切换按钮的状态发生变化时,会发出
  7. toggled()。

  8.   

答案 1 :(得分:0)

您可以使用EventFilter从此按钮中删除所有鼠标按下事件。

yourButton->installEventFilter(this); // this = MainWindow, change to your needs

bool MainWindow::eventFilter(QObject *obj, QEvent *event)    
{
    if (event->type() == QEvent::MouseButtonPress)
    {
        QPushButton *button = static_cast<QPushButton *>(obj);
        if (button == yourButton)
            if (button->isDown())
                return true;
    }
    // standard event processing
    return QObject::eventFilter(obj, event);
}

在另一个控制设置为false之后,everthing像以前一样工作。

答案 2 :(得分:-2)

必须设置一个按钮 checkable ,以便在失去焦点后保持其状态。

在调用setDown()之前尝试使用setChecked(TRUE)。