C++ 在C+周围制作一个QPushButton+;

C++ 在C+周围制作一个QPushButton+;,c++,qt,qt5,qpushbutton,qrect,C++,Qt,Qt5,Qpushbutton,Qrect,我正在尝试一个代码来制作一个QPushButton看起来圆的,这个代码似乎在工作,但执行后,它只显示椭圆的一半,有人能帮我弄清楚为什么只显示它的一半吗,是关于m_bouton1的问题吗 我在检查这个链接之前做过 但它不起作用,它似乎只是它的一半 #include <QtWidgets> #include "MyFenetre.h" #include "MyWindow.h" MyFenetre::MyFenetre() : QWidget() { setFixedSize(

我正在尝试一个代码来制作一个
QPushButton
看起来圆的,这个代码似乎在工作,但执行后,它只显示椭圆的一半,有人能帮我弄清楚为什么只显示它的一半吗,是关于m_bouton1的问题吗

我在检查这个链接之前做过

但它不起作用,它似乎只是它的一半

#include <QtWidgets>
#include "MyFenetre.h"
#include "MyWindow.h"

MyFenetre::MyFenetre() : QWidget()
{
    setFixedSize(300, 150);

    m_bouton = new QPushButton("Salut", this);
    m_bouton->setFont(QFont("Comic Sans MS", 14));
    m_bouton->move(110, 50);

    m_bouton1=new QPushButton("Boutton RounD (*)");
    m_bouton1->setFixedHeight(200);
    m_bouton1->setFixedWidth(200);

    QRect *rect = new QRect(0,0,190,190);

    qDebug() << rect->size();
    qDebug() << m_bouton1->size();

    QRegion *region = new QRegion(*rect,QRegion::Ellipse);

    qDebug() << region->boundingRect().size();

    m_bouton1->setMask(*region);

    QVBoxLayout *login_form= new QVBoxLayout;

    login_form->addWidget(m_bouton);
    login_form->addWidget(m_bouton1);

    setLayout(login_form);
    setWindowTitle("Button test");
    //setWindowIcon(QIcon("icone.png"));        

    // Connexion du clic du bouton à la fermeture de l'application
    QObject::connect(m_bouton, SIGNAL(clicked()), this, SLOT(changerFen()));
    QObject::connect(m_bouton1, SIGNAL(clicked()), this, SLOT(changerFen()));
}

void MyFenetre::changerFen()
{
    int f = 1;
    emit askDisplayFen(f);
}
#包括
#包括“MyFenetre.h”
#包括“MyWindow.h”
MyFenetre::MyFenetre():QWidget()
{
设置固定大小(300150);
m_bouton=新的QPushButton(“礼炮”,本);
m_bouton->setFont(QFont(“Comic Sans MS”,14));
m_bouton->移动(110,50);
m_bouton1=新的QPushButton(“Boutton圆(*));
m_bouton1->设置固定高度(200);
m_bouton1->设置固定宽度(200);
QRect*rect=新的QRect(0,0190190);
qDebug()大小();
qDebug()大小();
QRegion*区域=新QRegion(*矩形,QRegion::椭圆);
qDebug()boundingRect().size();
m_bouton1->设置掩码(*区域);
QVBoxLayout*登录表单=新的QVBoxLayout;
登录表单->添加小部件(m_bouton);
登录表单->添加小部件(m_bouton1);
setLayout(登录表单);
setWindowTitle(“按钮测试”);
//setWindowIcon(QIcon(“icone.png”);
//应用热情的气候联系
连接(m_bouton,信号(clicked()),这个,插槽(changerFen());
QObject::connect(m_bouton1,信号(clicked()),this,插槽(changerFen());
}
void MyFenetre::changerFen()
{
int f=1;
发出askDisplayFen(f);
}

主要问题是,相对于两个窗口的大小之和,窗口的大小太小,因此,如果要建立固定大小,则应正确计算,在这种情况下,请在添加按钮后进行计算

此外,我还将改进代码,因为您正在滥用动态内存,例如,创建指针不需要
QRect
,因为只需要一个副本,对于
QRegion
也是如此

myfenetre.h

#ifndef MYFENETRE_H
#define MYFENETRE_H

#include <QWidget>

class QPushButton;

class MyFenetre : public QWidget
{
    Q_OBJECT

public:
    MyFenetre(QWidget *parent = 0);
    ~MyFenetre();
signals:
    void askDisplayFen(float f);
private slots:
    void changerFen();
private:
    QPushButton *m_bouton;
    QPushButton *m_bouton1;
};

#endif // MYFENETRE_H
\ifndef MYFENETRE\H
#定义MYFENETRE_H
#包括
类按钮;
类MyFenetre:公共QWidget
{
Q_对象
公众:
MyFenetre(QWidget*parent=0);
~MyFenetre();
信号:
无效askDisplayFen(浮动f);
专用插槽:
void changerFen();
私人:
QPushButton*m_bouton;
QPushButton*m_bouton1;
};
#endif//MYFENETRE_H
myfenetre.cpp

#include "myfenetre.h"

#include <QPushButton>
#include <QVBoxLayout>

MyFenetre::MyFenetre(QWidget *parent)
    : QWidget(parent)
{
    m_bouton = new QPushButton("Salut");
    m_bouton->setFont(QFont("Comic Sans MS", 14));

    m_bouton1 = new QPushButton("Boutton RounD (*)");
    m_bouton1->setFixedSize(200, 200);
    QRect rect(QPoint(), m_bouton1->size());
    rect.adjust(10, 10, -10, -10);
    QRegion region(rect,QRegion::Ellipse);
    m_bouton1->setMask(region);

    QVBoxLayout *login_form= new QVBoxLayout(this);
    login_form->addWidget(m_bouton);
    login_form->addWidget(m_bouton1);

    setLayout(login_form);
    setWindowTitle("Button test");

    setFixedSize(300, minimumHeight());
    // Connexion du clic du bouton à la fermeture de l'application
    connect(m_bouton, &QPushButton::clicked, this, &MyFenetre::changerFen);
    connect(m_bouton1, &QPushButton::clicked, this, &MyFenetre::changerFen);
}

MyFenetre::~MyFenetre()
{

}

void MyFenetre::changerFen()
{
    int f = 1;
    emit askDisplayFen(f);
}
#包括“myfenetre.h”
#包括
#包括
MyFenetre::MyFenetre(QWidget*父)
:QWidget(父项)
{
m_bouton=新的QPushButton(“礼炮”);
m_bouton->setFont(QFont(“Comic Sans MS”,14));
m_bouton1=新的QPushButton(“Boutton圆(*));
m_bouton1->setFixedSize(200200);
QRect rect(QPoint(),m_bouton1->size());
直接调整(10,10,-10,-10);
QRegion区域(rect,QRegion::椭圆);
m_bouton1->设置掩码(区域);
QVBoxLayout*登录表单=新的QVBoxLayout(此);
登录表单->添加小部件(m_bouton);
登录表单->添加小部件(m_bouton1);
setLayout(登录表单);
setWindowTitle(“按钮测试”);
setFixedSize(300,最小高度());
//应用热情的气候联系
连接(m_bouton,&QPushButton::clicked,this,&MyFenetre::changerFen);
连接(m_bouton1,&QPushButton::clicked,this,&MyFenetre::changerFen);
}
MyFenetre::~MyFenetre()
{
}
void MyFenetre::changerFen()
{
int f=1;
发出askDisplayFen(f);
}

它可能重复,实际上是对这个链接的测试,但它不起作用。对了,我撤回了投票。请将此信息添加到问题中,以防止进一步接近投票:)。谢谢你可以检查它已经完成,我编辑了我的帖子:)你绝对需要使用遮罩吗?如果你只是选择圆形按钮,那么使用链接中的第二个答案(样式表)会容易得多。谢谢这是非常有用的:)@MadihaHarifi如果你回顾一下,我添加了比我的答案更多的改进。在C++中,内存管理很重要。是的,我确实注意到了这个问题,它实际上非常重要,我猜是在编译时间吗?@MadihaHarifi忘记了编译时间,这是不相关的,因为它只做了一次。内存的糟糕处理会在执行时带来问题。你说的没错,我在构建C++程序时所遇到的最大问题就是内存使用。