今天碰到一个bug,我在QT自定义控件类的内部做了获取该对象的shared_ptr指针,用了this指针,结果发现悲剧了,写了这行代码之后,设置样式表都无效了,就像下面这样:
class MineButton
{
public:
void on_MineButton_clicked();
}
void on_MineButton_clicked()
{
ui->MineButton->setStyleSheet("QPushButton{border-image: url(:/background.jpg);}");
boost::shared_ptr<MineButton> btn = boost::shared_ptr<MineButton>(this);
}
就是这样一行代码,让上面设置样式表的代码失效了,然后发帖求助,碰到大神告诉我,类要继承自boost::enable_shared_from_this,然后这个获取方式是通过shared_from_this()函数获得,遂改之,结果又抛出了一个boost::bad_weak_ptr()的异常,代码如下:
class MineButton:public boost::enable_shared_from_this<MineButton>
{
public:
void on_MineButton_clicked();
}
void on_MineButton_clicked()
{
ui->MineButton->setStyleSheet("QPushButton{border-image: url(:/background.jpg);}");
boost::shared_ptr<MineButton> btn = shared_from_this();
}
然后又百度,在stackoverflow里面看到了相关的解释,凭我拙计英文水平的理解,在调用shared_from_this()函数之前,这个类的对象由一个shared_ptr指针保存,然后我又改了一下代码,在包含了N个MineButton控件的Widget里面:
首先是Widget.h的代码:
class Widget
{
private:
std::vector<boost::shared_ptr<MineButton>> m_btns;
}
接下来是Widget.cpp的代码:
#InitBtn(i) m_btn[i]=boost::shared_ptr<MineButton>(ui->MineButton_##i)
这个ui->MineButton_0 ... ui->MineButton_N 的对象是QT已经帮我们创建好的,由于控件太多,所以写了一个宏定义,方便调用,至此,上面所述的问题就完全解决了。
下面来总结一下enable_shared_from_this的用法:
1. 包含头文件#include <boost/enable_shared_from_this.hpp>
2. 将这个类继承自enable_shared_from_this,注意后面要跟上模板参数,将你的类名写上,比如我的类是MineButton,就要 这样写:
class MineButton:public enable_shared_from_this<MineButton>
{
...
}
3. 确保这个类的对象被一个shared_ptr的指针保存
最后,以上只是我今天使用这一两个小时总结出来的,如果存在问题,欢迎阅读的各位指正,感谢您的不吝赐教!