Qt表单中是否有onChange事件?

7

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

我找到了一些changeEvent方法,但是当我写了连接代码:

connect(this, SIGNAL(this->changeEvent),this, SLOT(checkIfSomethingChanged()));

并尝试像这样检查它:

void importdb_module::checkIfSomethingChanged(){

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

我发现它不起作用。 每当表单中有更改时,我想检查一些条件,如何实现?请帮我解决这个问题。
2个回答

5

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
1
@DanilGholtsman,这是预料之中的,因为您的对象每秒都在改变:) 尝试摆脱消息框,并使用qDebug() << "I am changed";写入调试输出。 - vahancho
非常感谢您的回答,先生!如果我能接受多个答案,我也会接受您的答案,对此很抱歉。 - DanilGholtsman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接