首先我在QT自定义了一个控件MineButton,其实就是一个PushButton,然后头文件大概是这样(只写了出问题的相关部分)
class MineButton
{
public:
void ConnectClickedSignal(boost::function<void (boost::shared_ptr<MineButton>)> slot);
private:
void on_MineButton_clicked();
public:
boost::signal2::signal<void(boost::shared_ptr<MineButton>)> m_clicked_signal
}
ConnectClickedSignal函数实现就是简单的信号连接操作:
void MineButton::ConnectClickedSignal(boost::function<void (boost::shared_ptr<MineButton>)>)
{
m_clicked_signal.connect(slot);
}
然后在MineButton这个控件被点击触发的槽函数中,我进行了如下操作,试图把这个MineButton传出去,结果发现上面设置的样式表无效了:
void MineButton::on_MineButton_clicked()
{
ui->MineButton->setStyleSheet("QPushButton{border-image: url(:/background.jpg);}")
boost::shared_ptr<MineButton> btn_ptr = boost::share_ptr<MineButton>(this);
m_clicked_signal(btn_ptr);
}
然而像下面这样不用boost::shared_ptr,就用普通指针的时候,样式表设置正常,没有问题:
void MineButton::on_MineButton_clicked()
{
ui->MineButton->setStyleSheet("QPushButton{border-image: url(:/background.jpg);}")
MineButton* btn_ptr = this;
m_clicked_signal(btn_ptr);
}
请问这是为什么呢,有没有大神知道这是什么原因导致的?
8 个解决方案
#1
share_ptr 不是这样用的。。。
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
#2
enable_shared_from_this
#3
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗
#4
当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
#5
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗
share_ptr 不是这样用的。。。
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
#6
你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答! 谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗
share_ptr 不是这样用的。。。
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
一般都是在创建的时候直接构造,或者是由另一个shared_ptr拷贝构造,比如下面的写法是推荐的:
shared_ptr<MineButton> ptr(new MineButton);
//... other code
shared_ptr<MineButton> ptr2 = ptr1;
不应该先构造对象,再拿到对象的指针去构造shared_ptr,
比如下面这样的写法是不推荐,且有隐患的
MineButton *p = new MineButton();
//.. other code
shared_ptr<MineButton> ptr(p);
比如下面这样的写法是错的
MineButton obj;
shared_ptr<MineButton> ptr(&obj);
#7
你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答! 谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗
share_ptr 不是这样用的。。。
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
一般都是在创建的时候直接构造,或者是由另一个shared_ptr拷贝构造,比如下面的写法是推荐的:
shared_ptr<MineButton> ptr(new MineButton);
//... other code
shared_ptr<MineButton> ptr2 = ptr1;
不应该先构造对象,再拿到对象的指针去构造shared_ptr,
比如下面这样的写法是不推荐,且有隐患的
MineButton *p = new MineButton();
//.. other code
shared_ptr<MineButton> ptr(p);
比如下面这样的写法是错的
MineButton obj;
shared_ptr<MineButton> ptr(&obj);
#8
我明白你的意思了,但是这是一个控件对象,我把它拖拽到了QT的ui文件里面,它自己就自动生成对象了,就是说这个对象已经存在了的,请问你所说的隐患可能是什么,有什么方法可以规避掉吗 你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答! 谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗
share_ptr 不是这样用的。。。
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
一般都是在创建的时候直接构造,或者是由另一个shared_ptr拷贝构造,比如下面的写法是推荐的:
shared_ptr<MineButton> ptr(new MineButton);
//... other code
shared_ptr<MineButton> ptr2 = ptr1;
不应该先构造对象,再拿到对象的指针去构造shared_ptr,
比如下面这样的写法是不推荐,且有隐患的
MineButton *p = new MineButton();
//.. other code
shared_ptr<MineButton> ptr(p);
比如下面这样的写法是错的
MineButton obj;
shared_ptr<MineButton> ptr(&obj);
#1
share_ptr 不是这样用的。。。
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
#2
enable_shared_from_this
#3
share_ptr 不是这样用的。。。
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
#4
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗
share_ptr 不是这样用的。。。
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
#5
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗
share_ptr 不是这样用的。。。
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
#6
你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答! 谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗
share_ptr 不是这样用的。。。
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
一般都是在创建的时候直接构造,或者是由另一个shared_ptr拷贝构造,比如下面的写法是推荐的:
shared_ptr<MineButton> ptr(new MineButton);
//... other code
shared_ptr<MineButton> ptr2 = ptr1;
不应该先构造对象,再拿到对象的指针去构造shared_ptr,
比如下面这样的写法是不推荐,且有隐患的
MineButton *p = new MineButton();
//.. other code
shared_ptr<MineButton> ptr(p);
比如下面这样的写法是错的
MineButton obj;
shared_ptr<MineButton> ptr(&obj);
#7
你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答! 谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗
share_ptr 不是这样用的。。。
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
一般都是在创建的时候直接构造,或者是由另一个shared_ptr拷贝构造,比如下面的写法是推荐的:
shared_ptr<MineButton> ptr(new MineButton);
//... other code
shared_ptr<MineButton> ptr2 = ptr1;
不应该先构造对象,再拿到对象的指针去构造shared_ptr,
比如下面这样的写法是不推荐,且有隐患的
MineButton *p = new MineButton();
//.. other code
shared_ptr<MineButton> ptr(p);
比如下面这样的写法是错的
MineButton obj;
shared_ptr<MineButton> ptr(&obj);
#8
我明白你的意思了,但是这是一个控件对象,我把它拖拽到了QT的ui文件里面,它自己就自动生成对象了,就是说这个对象已经存在了的,请问你所说的隐患可能是什么,有什么方法可以规避掉吗 你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答! 谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗
share_ptr 不是这样用的。。。
如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this
然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
一般都是在创建的时候直接构造,或者是由另一个shared_ptr拷贝构造,比如下面的写法是推荐的:
shared_ptr<MineButton> ptr(new MineButton);
//... other code
shared_ptr<MineButton> ptr2 = ptr1;
不应该先构造对象,再拿到对象的指针去构造shared_ptr,
比如下面这样的写法是不推荐,且有隐患的
MineButton *p = new MineButton();
//.. other code
shared_ptr<MineButton> ptr(p);
比如下面这样的写法是错的
MineButton obj;
shared_ptr<MineButton> ptr(&obj);