qt ,在用代码设计自定义控件时候出现的问题:1.控件大小无法控制,2.控件无法正常显示。

本文讲述了作者在开发自定义控件过程中遇到的问题,如控件大小自动调整、子控件层级设置、以及如何正确处理图层和控件布局以确保组件正常显示。作者分享了解决这些问题的方法和经验教训。
摘要由CSDN通过智能技术生成

1.在自定义控件的时候,通过查看geometry发现自定义的控件会不自觉的变大,哪怕是给各个子控件都设置了QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed),而且是子控件都初始化好后,this->geometry()的值仍正常,通过按钮再来查看this->geometry()发现值变大了。(槽函数中都无设置size大小的使用)

具体问题并没有找到,当直接通过setFixedSize()来直接设置自定义组件本身this包括子组件的大小,发现比先设置resize(),再设置sizePolicy的方法来说就不会出现上面的问题。

2.在设计自定义控件的时候,我最初是想通过一个button来弹出slider,是一个类似于下拉框的效果,然后我最初是将slider所在的qwidget的父指针设置为this,这种方法使得自定义控件又无法显示,及slider所在的qwidget无法显示。

最后我的方法是将slider所在的qwidget的父指针设置为this的父指针,然后再修改了原先对qwidget的move()参数,成功显示出来了。(修改move的参数是由于,将slider所在的qwidget的父指针设置为this的父指针,那么qwidget的geometry的原点就不在是自定义控件的原点,变成this父指针的原点,及参照系发生改变)

3.由于我自定义的组件是要放在另一个widegt中的,开始发现自定义的组件无法正常显示的,以为是大小问题才无法正常显示,将组件调大些 还是没有解决,突然想到图层这一概论,我在自定义组件里将子控件raise()置于顶层,然后还是无法解决,最后通过在自定义组件所在的widget中设置其他控件lower()置于下一层,我的自定义控件才成功显示。

所以出现这一问题是由于我对图层概论不够清晰,在widget中不对其子控件进行图层处理都是最顶层的,所以在使用自定义组件的时候,需要对图层的层数进行考虑。

如有错误,望指正!

自定义控件的效果图:

放在widget中的自定义控件效果图:

以下是我自定义控件的demo:

.h

#ifndef SLIDERBUTTON_H
#define SLIDERBUTTON_H
​
#include <QWidget>
#include <QPushButton>
#include <QSlider>
#include <QLabel>
#include <QVBoxLayout>
#include <QDebug>
​
class SliderWidget : public QWidget{
     Q_OBJECT
    public:
    explicit SliderWidget(QWidget *parent = nullptr);
    ~SliderWidget();
protected:
    void leaveEvent(QEvent *event) override;
};
​
class SliderButton : public QWidget
{
    Q_OBJECT
    enum{
        SLIDERWIDE = 45,
        SLIDERHIGH = 100,
        BUTTONWIDE=45,
        BUTTONHIGH=45,
        LABELWIDE=45,
        LABELHIGH=20,
        WIDGETHIGH = SLIDERHIGH +LABELHIGH,
        WIDGETWIDE =(LABELWIDE>=SLIDERWIDE?LABELWIDE:SLIDERWIDE),
     
};
public:
    explicit SliderButton(QWidget *parent = nullptr);
    ~SliderButton();
private:
    QPushButton* button;
    QSlider* slider;
    QLabel* sliderValue;
    SliderWidget* w;
    int IconStatus;    // 0: 此时Icon 为 禁音
signals:
    void sliderChange(int value);
protected:
    void leaveEvent(QEvent *event) override;
​
};
​
#endif // SLIDERBUTTON_H
​

.cpp

#include "sliderbutton.h"
​
​
​
​
SliderButton::SliderButton(QWidget *parent) : QWidget(parent)
{
​
​
    w = new SliderWidget(parent);
    button   =new QPushButton(this);
    slider = new QSlider(w);
    sliderValue = new QLabel(w);
​
    sliderValue->setText("123");
​
    const QIcon& soundIcon = QIcon(":/Icon/soundButton.png");
    const QIcon& soundEnable = QIcon(":/Icon/enableSound.png");
    button->setIcon(soundEnable);
​
    button->setFixedSize(BUTTONWIDE,BUTTONHIGH);
    slider->setFixedSize(SLIDERWIDE,SLIDERHIGH);
    sliderValue->setFixedSize(LABELWIDE,LABELHIGH);
​
​
    w->setFixedSize(WIDGETWIDE,WIDGETHIGH);
    slider->move(0,0);
    sliderValue->move(0,SLIDERHIGH);
​
    button->move(0,0);
​
​
    w->setVisible(false);
    w->setStyleSheet("background-color: red;");
    this->setStyleSheet("background-color: yellow;");
    slider->setStyleSheet("background-color: pink;");
​
    this->setFixedSize(BUTTONWIDE,BUTTONHIGH);
    IconStatus = 0;
​
    // 点击音量按钮,显示滑块;
    connect(button,&QPushButton::clicked,this,[this,soundEnable,soundIcon](){
​
​
        static int volume = 20 ;
        if(IconStatus == 0){
            slider->setValue(volume);
            IconStatus =1;
        }else if(IconStatus == 1){  //
            slider->setValue(0);
            IconStatus = 0;
        }
        w->move(this->x(),this->y()-WIDGETHIGH);
        w->setVisible(true);
​
        qDebug()<<"this:"<<this->geometry();
        qDebug()<<"button"<<button->geometry();
        qDebug()<<"sliderValue"<<sliderValue->geometry();
        qDebug()<<"w"<<w->geometry();
        qDebug()<<"slider"<<slider->geometry();
​
    });
    // 设置音量
    connect(slider,&QSlider::valueChanged,this,[this,soundIcon,soundEnable](int value){
        if(value <= 0){
             button->setIcon(soundEnable);
        }else{
            button->setIcon(soundIcon);
        }
        emit sliderChange(value);
    });
​
}
​
SliderButton::~SliderButton()
{
​
}
​
SliderWidget::SliderWidget(QWidget *parent):QWidget(parent)
{
​
}
​
SliderWidget::~SliderWidget()
{
​
}
​
void SliderWidget::leaveEvent(QEvent *event)
{
    this->setVisible(false);
    QWidget::leaveEvent(event);
}
  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值