前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >其实,AI 也会糊弄你…

其实,AI 也会糊弄你…

作者头像
云水木石
发布2023-12-21 14:08:03
800
发布2023-12-21 14:08:03
举报

虽然我现在编程已经离不开 AI,但有时也会哭笑不得,因为 AI 会胡诌一个答案。特别好玩的是,当你指出回答错误的时候,AI 会继续给你一个错误的答案。

在收到错误的答案时,不要动怒。AI 也是学习的人类知识,网上的知识那么多错误,AI 又没有正确和错误的概念。再说,AI 胡诌一个答案,这一点和人类也很像,毕竟信口开河的人也很多。

如果 AI 给了你一个错误的答案,也不要灰心。排除一个错误答案,下一个回答正确的概率就会更高,多追问几次,说不定就得到了正确的答案。

下面我演示一下,如何对 AI 穷追猛打,最后得到满意答案的过程。下面的对话中 Q 代表我提的问题,A 是 AI 的回答。

我遇到的问题是这样的:在 QWidget 上拖动鼠标选择文字,会同时拖动窗口。于是有了如下对话:

Q:我在一个 widget上选择文本,为什么会导致QMainWindow移动

A:在 Qt 中,当你在一个 widget 上选择文本时,可能会触发鼠标事件,这可能会导致父级窗口(如 QMainWindow)移动。这是因为鼠标事件会被传递给父级窗口处理。

为了防止这种情况发生,你可以在子 widget 上重写鼠标事件处理函数,并在该函数中阻止事件传递给父级窗口。以下是一个示例:

代码语言:text
复制
void YourWidget::mousePressEvent(QMouseEvent *event) {
// 阻止事件传递给父级窗口
event->ignore();
}
  
 

通过在子 widget 上重写鼠标事件处理函数,并在其中调用 event->ignore(),你可以阻止鼠标事件传递给父级窗口,从而避免不必要的窗口移动。

Q:在linux系统下无效

A:在 Linux 系统下,阻止父级窗口移动的方法可能会有所不同。你可以尝试使用 setMouseTracking 函数来禁用鼠标跟踪,以防止鼠标事件触发父级窗口移动。以下是一个示例:

代码语言:text
复制
YourWidget::YourWidget(QWidget *parent) : QWidget(parent) {
    setMouseTracking(true); // 启用鼠标跟踪
}
void YourWidget::mousePressEvent(QMouseEvent *event) {
    // 阻止事件传递给父级窗口
    event->ignore();
}

  
 

通过在子 widget 中启用鼠标跟踪,并在鼠标事件处理函数中阻止事件传递给父级窗口,你可以尝试防止父级窗口移动。请注意,这种方法可能会因系统环境而异,具体效果可能会有所不同。

Q:还是会移动

A:在这种情况下,你可以尝试使用事件过滤器来拦截鼠标事件,以防止父级窗口移动。在你的子 widget 类中,你可以重写 eventFilter 函数来过滤鼠标事件,并在其中阻止事件传递给父级窗口。以下是一个示例:

代码语言:text
复制
bool YourWidget::eventFilter(QObject *obj, QEvent *event) {
if (event->type() == QEvent::MouseButtonPress) {
// 阻止事件传递给父级窗口
return true;
}
// 其他事件继续正常处理
return QObject::eventFilter(obj, event);
}
  
 

然后在你的子 widget 的构造函数中,安装事件过滤器:

代码语言:text
复制
YourWidget::YourWidget(QWidget *parent) : QWidget(parent) {
// 安装事件过滤器
installEventFilter(this);
}
 

通过使用事件过滤器,你可以拦截鼠标事件并阻止其传递给父级窗口,从而避免父级窗口移动。

​Q:这会导致本widget也收不到MouseButtonPress事件

A:你是对的,我犯了一个错误。使用事件过滤器会导致本身的 widget 也无法接收到鼠标事件。让我来提供一个更好的解决方案。

你可以在子 widget 中重写 mousePressEvent 函数,并在其中调用 ignore 函数来阻止事件传递给父级窗口。这样可以防止父级窗口移动,同时保持子 widget 的鼠标事件处理能力。以下是一个示例:

代码语言:text
复制
void YourWidget::mousePressEvent(QMouseEvent *event) {
event->ignore(); // 阻止事件传递给父级窗口
}

通过在子 widget 中重写 mousePressEvent 函数并调用 ignore 函数,你可以防止父级窗口移动,同时保持子 widget 的鼠标事件处理能力。

Q:调用event->ignore阻止不了

A:你是对的,我深表歉意。在这种情况下,可以尝试使用 event->accept() 来阻止事件传递给父级窗口。以下是一个示例:

代码语言:text
复制
void YourWidget::mousePressEvent(QMouseEvent *event) {
event->accept(); // 阻止事件传递给父级窗口
}

通过调用 event->accept(),你可以阻止鼠标事件传递给父级窗口,从而防止父级窗口移动。感谢你的耐心,希望这次能解决你的问题。

到此,问题终于得到解决。

AI 最大的优势是非常有耐心,要是人被这样被追问,估计早就火冒三丈了。

其次,AI 还是从人类这儿学了不少东西,比如,上面的答案虽然很多没解决问题,但看起来像那么回事。其实我们解 bug 也是各种尝试去解决问题,所以不要怪 AI 不一开始就给一个靠谱的答案。

最后,从上面的答案可以看出,AI 有时也会把错误的答案再次回复给你。如果来来回回给你相同的错误答案,说明 AI 也解答不了。要明白,有很多问题并不是一定有答案的。

总之,AI 虽然是程序员的好帮手,但目前 AI 的水平还不能取代程序员。请教问题的时候,需要甄别答案的有效性。碰到错误的回答,多问几次。

这篇文章是在地铁上用手机的订阅号助手写的,订阅号助手功能有限,所以上面的代码格式有些乱,将就着看吧。

码字不易,觉得不错点个赞吧。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云水木石 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档