Qt 程序实现所有控件屏蔽鼠标事件

开发中需要用到屏蔽鼠标事件达到防误触功能,查资料也找不到个好方法。

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);
    }


}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!要实现Qt程序中所有控件放大,您可以通过以下步骤来实现: 1. 在程序启动时,获取当前屏幕的分辨率和DPI值。 2. 遍历所有控件,计算出控件在当前屏幕分辨率下的大小和位置。 3. 根据当前屏幕的DPI值和目标DPI值(即放大倍数),计算出控件在目标DPI值下的大小和位置。 4. 将计算出的大小和位置应用到控件中。 5. 对于文本控件,还需要根据目标DPI值调整字体大小。 代码示例: ```cpp // 获取当前屏幕分辨率和DPI值 QScreen* screen = QGuiApplication::primaryScreen(); QRect screenGeometry = screen->geometry(); QSize screenSize = screenGeometry.size(); int dpi = screen->logicalDotsPerInch(); // 遍历所有控件 QWidget* mainWindow = QApplication::activeWindow(); QList<QWidget*> widgets = mainWindow->findChildren<QWidget*>(); foreach (QWidget* widget, widgets) { // 计算控件在当前屏幕分辨率下的大小和位置 QRect geometry = widget->geometry(); QPoint pos = widget->mapTo(mainWindow, QPoint(0, 0)); geometry.moveTopLeft(pos); QSize size = geometry.size(); size.scale(screenSize, Qt::KeepAspectRatio); // 计算控件在目标DPI值下的大小和位置 int targetDpi = 2 * dpi; // 放大2倍 QSize newSize = size * targetDpi / dpi; QPoint newPos = pos * targetDpi / dpi; // 应用计算出的大小和位置到控件中 widget->move(newPos); widget->resize(newSize); // 对于文本控件,调整字体大小 if (QLabel* label = qobject_cast<QLabel*>(widget)) { QFont font = label->font(); font.setPointSizeF(font.pointSizeF() * targetDpi / dpi); label->setFont(font); } // 同样的,对于其他的文本控件,也要进行字体大小的调整 else if (QTextEdit* edit = qobject_cast<QTextEdit*>(widget)) { QFont font = edit->font(); font.setPointSizeF(font.pointSizeF() * targetDpi / dpi); edit->setFont(font); } // ... } ``` 注意:上述代码只是一个示例,实际实现中还需要考虑一些细节问题,比如控件的最小大小、布局等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值