呼び出し可能なオブジェクトをコールバックとして使用する新しい Qt5 機能を試しました。
#include <QApplication>
#include <QPushButton>
#include <QWidget>
#include <QBoxLayout>
#include <cstdio>
class ButtonEventHandler
{
public:
ButtonEventHandler(const ButtonEventHandler& obj):
counter(obj.counter),r_button(obj.r_button)
{
printf("Copy from %p -> %p\n",&obj,this);
}
ButtonEventHandler& operator=(const ButtonEventHandler& obj)
{
r_button=obj.r_button;
counter=obj.counter;
printf("Assign from %p -> %p\n",&obj,this);
return *this;
}
explicit ButtonEventHandler(QPushButton& button):r_button(&button)
{
printf("CTOR %p\n",this);
counter=0;
}
void operator()(bool checked) noexcept
{
char buffer[32];
printf("%p counter:%zu\n",this,counter);
sprintf(buffer,"%zu",counter);
r_button->setText(buffer);
++counter;
}
private:
size_t counter;
QPushButton* r_button;
};
int main(int argc,char** argv)
{
QApplication app(argc,argv);
QWidget window;
QHBoxLayout box;
window.setLayout(&box);
window.setFixedSize(400,300);
QPushButton button1("Click me");
ButtonEventHandler eh1(button1);
QObject::connect(&button1,&QPushButton::clicked,eh1);
box.addWidget(&button1);
window.show();
return app.exec();
}
出力例:
CTOR 0x7ffdd35f4ed0
Copy from 0x7ffdd35f4ed0 -> 0x7ffdd35f4ee0
Copy from 0x7ffdd35f4ee0 -> 0x7ffdd35f4e70
Copy from 0x7ffdd35f4e70 -> 0x21b2c10
Copy from 0x21b2c10 -> 0x7ffdd35f4050
0x7ffdd35f4050 counter:0
Copy from 0x21b2c10 -> 0x7ffdd35f4050
0x7ffdd35f4050 counter:0
Copy from 0x21b2c10 -> 0x7ffdd35f4050
0x7ffdd35f4050 counter:0
Copy from 0x21b2c10 -> 0x7ffdd35f4050
0x7ffdd35f4050 counter:0
ただし、実際には期待どおりに動作しません。コールバックオブジェクトをコピーすることから始まります(私はそれを理解しています:それが関連付けられているオブジェクトの前に範囲外に出ることはありません)。ただし、オブジェクトは発生するすべてのイベントの前にコピーされるため、カウンターはゼロに保たれます。オブジェクトを不変に保つのはなぜですか?