开发中需要用到屏蔽鼠标事件达到防误触功能,查资料也找不到个好方法。
this->parentWidget()->setAttribute(Qt::WA_TransparentForMouseEvents, true); // 屏蔽 鼠标事件
this->parentWidget()->setAttribute(Qt::WA_TransparentForMouseEvents, false); // 开启 鼠标事件
// 上述方法会导致程序闪退
// 下面方法也无效
this->setAttribute(Qt::WA_TransparentForMouseEvents, true);
经(不够充分的)测试,setAttribute(Qt::WA_TransparentForMouseEvents, true);的方式最能作用于ui控件
// 此方法是有用的
ui->pushButton->setAttribute(Qt::WA_TransparentForMouseEvents, true);
通过一条指令是实现不了了(我也是萌新,不愿意多找)
索性就尝试遍历widget的所有控件,然后循环屏蔽
// 遍历widget下的所有子控件
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QObjectList list = this->children(); // 只返回this下的所有子控件,不返回子控件的子控件
for (int i = 0; i < list.count(); i++)
{
qDebug() << list.at(i)->objectName(); // 打印所有子控件的控件名
}
}
因为this->children(); 返回的是QObject对象的list ,而setAttribute() 函数是QWidget的成员函数,
就需要获取QWidget的控件对象。
findChild模板 就可以通过获取控件名,来获取对应QWidget*的对象,这样就解决了遍历所有控件,循环来屏蔽所有控件的鼠标事件。
//
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QObjectList list = this->children(); // 只返回this下的所有子控件,不返回子控件的子控件
for(int i = 0; i < list.count(); i++)
{
// 通过控件名返回对应QWidget*的对象
QWidget* w = findChild<QWidget *>(list.at(i)->objectName());
w->setAttribute(Qt::WA_TransparentForMouseEvents, true);
}
}