QT自定义控件用boost::shared_ptr之后设置样式表无效的问题

时间:2021-08-18 23:25:32
我的外部有一个widget窗口,上面有一两百个自定义的MineButton控件,我的想法是在MineButton里面实现点击就向widget发送信号的功能,让widget知道是哪一个被点击了,然后进行相关的操作。

首先我在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();

#2


enable_shared_from_this

#3


引用 1 楼 zilaishuichina 的回复:
share_ptr 不是这样用的。。。  

如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this

然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗

#4


引用 3 楼 zhounixing 的回复:
Quote: 引用 1 楼 zilaishuichina 的回复:

share_ptr 不是这样用的。。。  

如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this

然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗


当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。

#5


引用 4 楼 zilaishuichina 的回复:
Quote: 引用 3 楼 zhounixing 的回复:

Quote: 引用 1 楼 zilaishuichina 的回复:

share_ptr 不是这样用的。。。  

如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this

然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗


当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答!

#6


引用 5 楼 zhounixing 的回复:
Quote: 引用 4 楼 zilaishuichina 的回复:

Quote: 引用 3 楼 zhounixing 的回复:

Quote: 引用 1 楼 zilaishuichina 的回复:

share_ptr 不是这样用的。。。  

如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this

然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗


当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答!


一般都是在创建的时候直接构造,或者是由另一个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


引用 6 楼 zilaishuichina 的回复:
Quote: 引用 5 楼 zhounixing 的回复:

Quote: 引用 4 楼 zilaishuichina 的回复:

Quote: 引用 3 楼 zhounixing 的回复:

Quote: 引用 1 楼 zilaishuichina 的回复:

share_ptr 不是这样用的。。。  

如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this

然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗


当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答!


一般都是在创建的时候直接构造,或者是由另一个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);
我明白你的意思了,但是这是一个控件对象,我把它拖拽到了QT的ui文件里面,它自己就自动生成对象了,就是说这个对象已经存在了的,请问你所说的隐患可能是什么,有什么方法可以规避掉吗

#8


引用 7 楼 zhounixing 的回复:
Quote: 引用 6 楼 zilaishuichina 的回复:

Quote: 引用 5 楼 zhounixing 的回复:

Quote: 引用 4 楼 zilaishuichina 的回复:

Quote: 引用 3 楼 zhounixing 的回复:

Quote: 引用 1 楼 zilaishuichina 的回复:

share_ptr 不是这样用的。。。  

如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this

然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗


当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答!


一般都是在创建的时候直接构造,或者是由另一个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);
我明白你的意思了,但是这是一个控件对象,我把它拖拽到了QT的ui文件里面,它自己就自动生成对象了,就是说这个对象已经存在了的,请问你所说的隐患可能是什么,有什么方法可以规避掉吗
忘了说明,这些控件对象会一直存在直到程序结束,并且shared_ptr指针和控件对象是一一对应的,不会出现两个shared_ptr的指针指向同一个控件对象的情况

#1


share_ptr 不是这样用的。。。  

如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this

然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();

#2


enable_shared_from_this

#3


引用 1 楼 zilaishuichina 的回复:
share_ptr 不是这样用的。。。  

如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this

然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗

#4


引用 3 楼 zhounixing 的回复:
Quote: 引用 1 楼 zilaishuichina 的回复:

share_ptr 不是这样用的。。。  

如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this

然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗


当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。

#5


引用 4 楼 zilaishuichina 的回复:
Quote: 引用 3 楼 zhounixing 的回复:

Quote: 引用 1 楼 zilaishuichina 的回复:

share_ptr 不是这样用的。。。  

如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this

然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗


当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答!

#6


引用 5 楼 zhounixing 的回复:
Quote: 引用 4 楼 zilaishuichina 的回复:

Quote: 引用 3 楼 zhounixing 的回复:

Quote: 引用 1 楼 zilaishuichina 的回复:

share_ptr 不是这样用的。。。  

如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this

然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗


当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答!


一般都是在创建的时候直接构造,或者是由另一个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


引用 6 楼 zilaishuichina 的回复:
Quote: 引用 5 楼 zhounixing 的回复:

Quote: 引用 4 楼 zilaishuichina 的回复:

Quote: 引用 3 楼 zhounixing 的回复:

Quote: 引用 1 楼 zilaishuichina 的回复:

share_ptr 不是这样用的。。。  

如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this

然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗


当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答!


一般都是在创建的时候直接构造,或者是由另一个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);
我明白你的意思了,但是这是一个控件对象,我把它拖拽到了QT的ui文件里面,它自己就自动生成对象了,就是说这个对象已经存在了的,请问你所说的隐患可能是什么,有什么方法可以规避掉吗

#8


引用 7 楼 zhounixing 的回复:
Quote: 引用 6 楼 zilaishuichina 的回复:

Quote: 引用 5 楼 zhounixing 的回复:

Quote: 引用 4 楼 zilaishuichina 的回复:

Quote: 引用 3 楼 zhounixing 的回复:

Quote: 引用 1 楼 zilaishuichina 的回复:

share_ptr 不是这样用的。。。  

如果想在类对象内部获得该对象的share_ptr,应该让 MineButton 继承 enable_share_from_this

然后 boost::shared_ptr<MineButton> btn_ptr = shared_from_this();
谢谢回答,知道问题所在了,但是如果不在外部创建MineButton这个类的shared_ptr对象,调用shared_from_this()这个函数会抛异常?我自己试和百度的结果都是这样,请问是这样吗


当然了, 你都没有创建这个对象, 你怎么取这个对象的指针, 指针都没有, 还谈什么智能指针。。。。
你误解我意思了,这个对象是存在的,只不过不是shared_ptr的,然后我刚刚用一个shared_ptr的指针指向了它,结果就好了,很庆幸今天之前能解决这个问题,非常感谢你的回答!


一般都是在创建的时候直接构造,或者是由另一个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);
我明白你的意思了,但是这是一个控件对象,我把它拖拽到了QT的ui文件里面,它自己就自动生成对象了,就是说这个对象已经存在了的,请问你所说的隐患可能是什么,有什么方法可以规避掉吗
忘了说明,这些控件对象会一直存在直到程序结束,并且shared_ptr指针和控件对象是一一对应的,不会出现两个shared_ptr的指针指向同一个控件对象的情况