我有一个QPushButton
,我想把它推进去#34;所以我打电话给
btn->setDown(true);
但是这并没有更新按钮的外观或行为(它仍然被提升,可以按下)。
当我从一般函数调用该命令时会发生这种情况,但是当我按下一个被按下时触发的函数(通过将slot
绑定到其clicked()
{ {1}})。
如预期的那样,属性signal
的值为true,但行为不匹配。缺少什么?
答案 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位)上进行了测试。
它看起来像预期的那样。
我看起来不像&#34;按钮已关闭。&#34;但这是他在我的Windows 10上呈现的方式,默认的Qt风格("windowsvista"
)模仿了Windows的外观和感觉。至少,当切换复选框时,您可以看到按钮的可见更改。除此之外,它还具有鼠标点击按钮时的精确外观。
注意:强>
致电QPushButton::setDown()
不会发出pressed()
或clicked()
信号。
来自Qt doc。 (由我强调):
如果是这样,则必须使用其他方法:QPushButton::click()
这在Qt doc中有所描述。 QAbstractButton
的{(QPushButton
中继承的):
QAbstractButton提供了四个信号:
答案 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)。