【问题标题】:Is there in Qt forms onChange event?Qt 表单中有 onChange 事件吗?
【发布时间】:2013-11-06 10:23:17
【问题描述】:

Qt 中是否有类似于 Delphi 中的Form.onChange 的东西?

我找到了一些changeEvent 方法,但是当我写连接时 connect(this, SIGNAL(this->changeEvent),this, SLOT(checkIfSomethingChanged()));

并试图像那样检查它

void importdb_module::checkIfSomethingChanged(){

    QMessageBox::information(0, "", "Test");
}

我意识到它不起作用。

每当我的表单发生变化时,我想检查一些条件,该怎么做?

【问题讨论】:

    标签: c++ qt delphi events


    【解决方案1】:

    changeEvent 槽是 QWidget 中的一个虚拟的、受保护的函数。因此,如果您从 QWidget 或任何 QWidget 派生类继承,您将能够覆盖该函数。例如:-

    class MyForm : public QWidget
    {
        protected slots:
            virtual void changeEvent(QEvent * event);
    }
    
    
    void MyForm::changeEvent(QEvent* event)
    {
        // Do something with the event    
    }
    

    如果您想在事件之外知道表单已更改,您可以向表单添加一个信号并从 changeEvent 发出它以传递事件:-

    class MyForm : public QWidget
    {
       signals:
            void FormChanged(QEvent* event);
    
        protected slots:
            virtual void changeEvent(QEvent * event);
    }
    
    
    void MyForm::changeEvent(QEvent* event)
    {
        emit FormChanged(event);
    }
    

    现在使用 Qt 5 连接语法将另一个类连接到新信号:-

    connect(myFormObject, &MyForm::FormChanged, someclassObject, &SomeClass::HandleFormChanged);
    

    【讨论】:

      【解决方案2】:

      这行不通,因为您混淆了两个概念:事件和信号/槽。为了让它工作,你需要重写你的类的changeEvent() 虚函数。像这样的:

      void MyWidget::changeEvent(QEvent *event)
      {
          QMessageBox::information(0, "", "Test");
      }
      

      【讨论】:

      • 哦,成功了!但有新问题 - 消息框每秒出现一次!
      • @DanilGholtsman,这是意料之中的,因为您的对象每秒都在变化:) 尝试摆脱消息框并使用qDebug() << "I am changed"; 写入调试输出。
      • 非常感谢您的回答,先生!如果我能接受多个答案,我也接受了你的答案,对此深表歉意
      猜你喜欢
      • 2012-05-22
      • 1970-01-01
      • 2012-10-29
      • 2020-11-07
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      相关资源
      最近更新 更多