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);
}