c++ - 将矩形 Qt 按钮更改为圆形

标签 c++ qt qt-designer

我正在尝试在 Qt 中创建一个圆形按钮。在设计器中创建了一个带有单个按钮 QPushButton 的简单表单。我正在尝试使用 setMask() 将其变成圆形按钮。一旦应用 setMask() 按钮就会消失。是否需要创建自定义小部件来制作圆形按钮?

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QtGui/QPushButton>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->pushButton->setText("Test Text");
    ui->pushButton->setFixedHeight(200);
    ui->pushButton->setFixedWidth(200);

    //Set Starting point of region 5 pixels inside , make region width & height
    //values same and less than button size so that we obtain a pure-round shape

    QRegion* region = new QRegion(*(new QRect(ui->pushButton->x()+5,ui->pushButton->y()+5,190,190)),QRegion::Ellipse);
    ui->pushButton->setMask(*region);
    ui->pushButton->show();


}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    QMessageBox msgbox;
    msgbox.setText("Text was set");
    msgbox.show();

}

注意:如果按钮是在代码中创建的并且在显示窗口之前应用到窗口,则显示该按钮。我想使用 Qt Designer 的 WYSIWIG 功能,而不是用代码创建整个表单。

最佳答案

它会变得不可见,但这是因为您没有以正确的点为中心的椭圆。

QWidget::setMask仅使与区域重叠的小部件部分可见。如果该区域包含小部件 rect() 之外的像素,则窗口系统控制该区域可能可见也可能不可见,具体取决于平台”。

试试这段代码,你会看到:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->pushButton->setText("Test Text");
    ui->pushButton->setFixedHeight(200);
    ui->pushButton->setFixedWidth(200);
    QRect rect(0,0,190,190);
    qDebug() << rect.size();
    qDebug() << ui->pushButton->size();
    QRegion region(rect, QRegion::Ellipse);
    qDebug() << region.boundingRect().size();
    ui->pushButton->setMask(region);
}

附言。为什么要两次设置按钮的高度?我假设这是一个错字,你指的是宽度。

关于c++ - 将矩形 Qt 按钮更改为圆形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12734319/

相关文章:

c++ - 有没有办法使用 mongocxx 驱动程序从 GridFS 集合文件下载任意范围?

c++ - 填充 vector <int>*

c++ - 为什么 Qt 信号不是 const

c++ - 在主窗口中添加 QHBoxLayout

Qt 和 Qt Designer - 使小部件填充父级而不填充

c++ - 当存储在 std::function 中时,Captureless lambda 不能转换为函数指针

c++ - 条件中的逗号运算符

qt - QML 导入语句 : why specify module version?

c++ - 是否可以将模型对象的插槽连接到 QT4 -Designer 中的 GUI?

python - 如何修改QT设计器生成的现有PlotWidget的viewbox?