其实,AI 也会糊弄你…

2023-12-21 14:08:03 浏览数 (2)

虽然我现在编程已经离不开 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 的水平还不能取代程序员。请教问题的时候,需要甄别答案的有效性。碰到错误的回答,多问几次。

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

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

0 人点赞