web-dev-qa-db-ja.com

長方形のQtボタンを丸く変更します

Qtで丸いボタンを作成しようとしています。デザイナーでボタン1つ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();

}

注:ボタンがコードで作成され、ウィンドウが表示される前にウィンドウに適用された場合、ボタンが表示されます。フォーム全体をコードで作成するのではなく、QtDesignerのWYSIWIG機能を使用したいと思います。

10
DarwinIcesurfer

見えなくなりますが、正しい点を中心とした楕円がないためです。

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

追伸プッシュボタンの高さを2回設定するのはなぜですか?私はそれがタイプミスだと思います、そしてあなたは幅を意味しました。

18
stackunderflow

最も簡単な解決策はスタイルシートを使用することだと思います。

このような:

 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;

および 参照 も参照してください。

標準スタイルは適用されないため、ボタンの完全なスタイルを作成する必要があることに注意してください。

13
Lol4t0