11

我正在尝试在 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 功能,而不是在代码中创建整个表单。

4

3 回答 3

22

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

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

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

于 2012-10-04T19:56:12.530 回答
17

我认为最简单的解决方案是使用样式表。

像这样:

 background-color: white;
 border-style: solid;
 border-width:1px;
 border-radius:50px;
 border-color: red;
 max-width:100px;
 max-height:100px;
 min-width:100px;
 min-height:100px;

另请参阅示例参考

请注意,您必须为按钮创建完整的样式,因为标准样式将不适用。

于 2012-10-04T19:32:37.923 回答
0

这将完美地尝试这个 -

QPushButton {
color: #333;
border: 2px solid #555;
border-radius: 20px;
border-style: outset;
background: qradialgradient(
cx: 0.3, cy: -0.4, fx: 0.3, fy: -0.4,
radius: 1.35, stop: 0 #fff, stop: 1 #888
);
padding: 5px;
}

QPushButton:hover {
background: qradialgradient(
cx: 0.3, cy: -0.4, fx: 0.3, fy: -0.4,
radius: 1.35, stop: 0 #fff, stop: 1 #bbb
);
}
于 2021-06-24T15:12:21.630 回答