开发者社区> 问答> 正文

继承QLabel后重载鼠标事件后图片显示不正常? 400 报错

继承QLabel后重载鼠标事件后图片显示不正常? 400 报错

下图是未继承时显示的

下面是继承后添加鼠标单击动作后显示的,

继承的后只添加了事件处理和处理函数,及相关信号动。构造函数是这样的:

ImageLabel(QLabel *parent);

初始化是使用在相关的QWidget上定义好的label作为夫对象:

imagelabel = new imageLabel(label);

鼠标单击动作实现了,但是就是显示图片出错。。。。

这是怎么回事?

继承的类的代码:

class AvatarLabel : public QLabel 
{
    Q_OBJECT

    public:
        AvatarLabel(QLabel *);
        void mouseReleaseEvent(QMouseEvent *);
    signals:
        void sigleClicked();
    private slots:
        void showUserInfo();
};



其中的槽只是用于测试是否成功,单纯的显示一个QMessageBox的提示。

在另一个自定义的类menberItem中声明有这个类的对象指针imageLabel,然后在menberItem构造时初始化imageLabel(avatar),父对象avatar在ui_menberItem.h中声明并初始化。代码好多就不贴玩了,值贴ui_menberItem.h中声明的avatar

avatar = new QLabel(menberItem);
        avatar->setObjectName(QString::fromUtf8("avatar"));
        avatar->setGeometry(QRect(0, 3, 47, 47));
        avatar->setMinimumSize(QSize(30, 30));
        avatar->setMaximumSize(QSize(60, 60));
        avatar->setStyleSheet(QString::fromUtf8(""));
        avatar->setScaledContents(true);




在test.cpp中使用了类menberItem,并使用menberItem类定义的函数设置图片,设置图片的代码:

QPixmap pix(path);
    avatar_lb->setPixmap(pix);
    avatar_lb->setToolTip( u_username );



avatar_lb实在menberItem中声明private AvatarLabel对象

在test.cpp中使用相对路径设置图像:"./icon/headport.png"。如果不是用重载的AvatarLabel的话显示如上第一张图,是没有问题的。使用AvatarLabel后就不行了。如第二张图。

展开
收起
爱吃鱼的程序员 2020-05-29 20:43:16 874 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    路径的问题?######回复 @锋了 : 解决了,方法是在继承的类的构造方法中加入下面两行: this->setScaledContents(true); this->resize(parent->size());######添加了更详细的问题描述,你看看是哪里出的问题,谢谢######

    ...这个……没有代码看着可能性太多了:

    首先:imagelabel的大小改变了么?因为只是指定parent是不会影响大小的。父对象的大小有没有问题?contentsMargin有没有设置成0?是不是设置了Layout?Layout的contentsMargin有没有问题?其次,scaledContents属性是否进行过设置?第三:鼠标单击后执行的事件是什么?有没有可能造成背景的改变?

    凭空猜测可能性很多。建议最好把代码放上来。

    ######解决了,方法是在继承的类的构造方法中加入下面两行: this->setScaledContents(true); this->resize(parent->size());######已更新问题描述,看看是哪里的问题,谢谢###### 首先啊……这个…… void mouseReleaseEvent(QMouseEvent *);应该是protected而不是public……
    ######回复 @锋了 :但是这个问题没有解决,楼下有描述。问题:我写了个资源文件,但是在右键菜单的QAction中使用设置图标无发显示,在pro文件中也加了RESOURCE = xxx.qrc######它原来就是private的吗?不太清楚这个,边学边急着用######

    额,你这个使用了UI文件么……这个我就不是很清楚了……

    从没用过UI文件,界面只是自己硬编码过……帮你顶一下吧……

    ######因为还不太熟悉QT,所以部分的界面就直接用creator生成了,后面操作的才自己写######

    我感觉你这个很明显就是因为背景图片没有缩放导致的。

    建议手动缩放一下:
    在你继承的类的构造方法里加上下面几句话:

    QPixmap map;
    map.load(“image.png”);
    QPalette palette;
       palette.setBrush(QPalette::Background,QBrush(map.scaled(this->width(),this->height())));
    this->setAutoFillBackground(true);
    this->setPalette(palette); //set backimage



    在palette.setBrush方法里将图片缩放成控件大小

    ######回复 @quanwei9958 : 啊,我领会错了,你说的是在构造方法中了,我试下先######回复 @quanwei9958 : 是把代码改成楼下这样的吗?######回复 @锋了 : 继承后应该不会改变原有有控件绘制方式 你添加图片的时候手动缩放一下吧######但是不使用我继承的类直接使用QLabel的话就可以显示正常的,是继承后改变了社么吗?######
    QPixmap     pix(avatar);                 /* 头像 */
        QPixmap     map;
        map.load("./icon/head.png");
        QPalette    palette;
        palette.setBrush(QPalette::Background, QBrush(map.scaled(lb_avatar->width(), lb_avatar->height())));
        lb_avatar->setAutoFillBackground(true);
        lb_avatar->setPalette(palette);
        lb_avatar->setPixmap(pix);
        lb_avatar->setToolTip( u_username );
    这样是设置背景吗,还是没有显示成功哦



    ######

    我写了个资源文件,但是在右键菜单的QAction中使用设置图标无发显示,在pro文件中也加了RESOURCE = xxx.qrc

    <RCC>
    <qresource>
        <file>icon/err.png</file>
        <file>icon/msg.png</file>
        <file>icon/headport.png</file>
        <file>icon/head.png</file>
    </qresource>
    </RCC>



    引用方法是setIcon(QIcon(":/icon/err.png"));

    ######

    按照@quanwei9958的方法设置后效果变成这样了,好像还是label的问题。还有我设置的图片路径没有显示背景图片的。

    map.load("./icon/head.png");

    ######回复 @quanwei9958 : 但是这个问题没有解决,楼下有描述。问题:我写了个资源文件,但是在右键菜单的QAction中使用设置图标无发显示,在pro文件中也加了RESOURCE = xxx.qrc######回复 @quanwei9958 : 解决了,的确是设置的图片不能自动设置缩放,但这应该不是背景图片吧。方法是在继承的类的构造函数中加入下面两行: this->setScaledContents(true); this->resize(parent->size());######回复 @quanwei9958 : 还是这样,会不会是我memberItem类继承的问题。 class memberItem : public QWidget,public QTreeWidgetItem, private Ui::memberItem { };######回复 @quanwei9958 : 错了,不是rescale而是scaled()######map.load下面再加一句 map=map.rescale(width,height); 分别为你Label的width,height######

    还是我测试的代码出问题呢?

    /*组2*/
        QTreeWidgetItem *group_2 = new QTreeWidgetItem(&treeWidget, QStringList("Root"), 0);
        group_2->setIcon(0, QIcon("./icon/close.png"));
        group_2->setText(0, QObject::tr("root"));
        group_2->setSizeHint(0, QSize(100, 20));
        
        ContactsItem    *citem = new ContactsItem(group_2);
        citem->setName(QObject::tr("Fengzi"));
        citem->setAvatar("./icon/headport.png");
        citem->setStatusIcon("./icon/online_status.png", "online");
        citem->setSignature("今天心情不错!");
        QTreeWidgetItem *Contact_3 = new QTreeWidgetItem(group_2);
        Contact_3->setSizeHint(0, QSize(100, 50));
        treeWidget.setItemWidget(Contact_3, 0, citem);



    ######其实用qss写出来样式就可以了######怎么做呢
    2020-05-29 20:43:17
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载