「Qtのコントロール - プッシュボタン」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
102行目: 102行目:
* ui->pushButton->click();
* ui->pushButton->click();
*: <code>toggled(bool)</code>も<code>clicked(bool)</code>も呼び出される。(UI操作でボタンを押下したのと同様)
*: <code>toggled(bool)</code>も<code>clicked(bool)</code>も呼び出される。(UI操作でボタンを押下したのと同様)
<br><br>
== 画像の表示 ==
==== プッシュボタンの画像 ====
プッシュボタンは、画像とテキストが表示できる。<br>
<br>
画像の位置は固定、画像のサイズは指定可能であり、テキストの左側に表示される。<br>
プッシュボタンコントロールのサイズを変更しても、画像のサイズは自動的に変化しない。<br>
<br>
画像のサイズを指定しない場合は、原画像のサイズで表示される。<br>
<syntaxhighlight lang="c++">
std::unique_ptr<QPushButton> pBtn = std::make_unique<QPushButton>();
pBtn->setIcon(style()->standardIcon(QStyle::SP_ArrowDown));
pBtn->setText(tr("Test"));
pBtn->setIconSize(QSize(32, 32));
pBtn->setFont(QFont("Meiryo", 18));
</syntaxhighlight>
<br>
==== フレーム画像 ====
背景画像ではなく境界画像を指定する場合、サイズ変更に対応した枠を表示できる。<br>
<syntaxhighlight lang="c++">
std::unique_ptr<QPushButton> pBtn = std::make_unique<QPushButton>();
pBtn->setText(tr("Test"));
pBtn->setStyleSheet(
                      "border-width:27px; padding:10px; color:red;"
                      "background-image:url(:/images/close-hover.gif); background-color:skyblue;"
                      "border-image:url(:/images/border.png) 27 repeat;");
</syntaxhighlight>
<br>
下図左は、border.pngファイルである。<br>
黒い箇所が透過の場合、背景色と背景画像が見える。<br>
repeatを指定しない場合は、引き伸ばした画像に変換される。<br>
<br>
原画像を9分割して組み合わせることにより、境界線の長さの変化に対応することができる。<br>
下図中央の緑の部分が、border-widthで指定した27pxの境界である。<br>
②④⑥⑧の画像は、タイプにしたがって引き伸ばしたり、タイル状に敷き詰めたりする。<br>
<br>
例えば、border-imageの幅を54に変更する時、左上・右上・左下・右下の四隅は、以下のようになる。<br>
上下左右の境界画像は、②④⑥⑧に対応する部分が足りなくなるため、表示されない。<br>
* 左上
*: ① + ② + ④ + ⑤
* 右上
*: ② + ③ + ⑤ + ⑥
* 左下
*: ④ + ⑤ + ⑦ + ⑧
* 右下
*: ⑤ + ⑥ + ⑧ + ⑨
<br>
border-imageは、最初に画像データを指定する必要がある。その他の項目はどちらを先に記述しても構わない。<br>
<br>
下表に、境界画像(border-image)の設定例を示す。<br>
image-widthの指定方法は、CSSのmarginプロパティと同様である。<br>
<center>
{| class="wikitable" style="background-color:#fefefe;"
|-
! style="background-color:#00ffff;" | 項目
! style="background-color:#00ffff;" | 初期値
! style="background-color:#00ffff;" | 設定例
! style="background-color:#00ffff;" | 説明
|-
| 画像データ<br>(image-source) || none || url(:/images/border.png)<br>url(C:/temp/frame.gif) || リソース画像<br>画像ファイル
|-
| 幅と高さ<br>(image-width) || 1 || 20<br>2em 5% 3 || 上下左右20px<br>上2em、左右5%、下3px
|-
| タイプ<br>(image-repeat) || stretch || round<br>repeat stretch || 縦横ともに均等タイル<br>横方向はタイル、縦方向は伸縮
|}
</center>
<br>
タイプの種類は、タイル(repeat)、均等タイル(round)、伸縮(stretch)の3種類がある。<br>
<br>
例えば、上図②の場合、タイル(repeat)は単純に②を並べるため、途中で画像が切れることがある。<br>
均等タイル(round)は、②を何個表示できるかを計算して、均等になるように②の幅を伸縮する。(端数は四捨五入)<br>
<br>
==== プッシュボタンのフレーム ====
背景としてフレーム画像を指定する場合、プッシュボタンのサイズ変更に対応できない。<br>
<syntaxhighlight lang="c++">
button->setStyleSheet(
                        "background:skyblue url(:/images/frame.png) no-repeat;");
</syntaxhighlight>
<br>
境界としてフレーム画像を指定することにより、プッシュボタンのサイズ変更に対応することができる。<br>
<syntaxhighlight lang="c++">
button->setStyleSheet(
                        "border-width:4px; background-color:skyblue;"
                        "border-image:url(:/images/frame.png) 4;");
</syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:Qt]]
[[カテゴリ:Qt]]

2021年3月21日 (日) 17:20時点における版

概要

Qtにおいて、QPushButtonクラスを使用してボタンをコントロールする手順を記載する。


プッシュボタンの角を丸くする

Qt Designer画面にて、プッシュボタンを配置する。

次に、Qt Designer画面にて、プッシュボタンのスタイルシートを設定する。
プッシュボタンの角を丸くするには、border-radiusプロパティにて、丸みの半径をpxで指定する。
(丸みの半径の値が大きいほど丸く、小さいほど角になる)

 /* プッシュボタンの前景色と背景色を指定する */
 QPushButton
 {
    color: rgb(255, 255, 255);
    background-color: rgb(0, 0, 0);
 }


 /* 前景色、背景色、border-rariusを指定する */
 QPushButton
 {
    color: rgb(255, 255, 255);
    background-color: rgb(0, 0, 0);
    border-radius: 10px;
 }



プッシュボタンの背景色をグラデーションにする

QLinearGradientクラスを使用して、プッシュボタンの左上を(0, 0)、右下を(1, 1)として、
始点(x1, y1)および終点(x2, y2)を指定すると、始点から終点に向かってグラデーションとなる。

stopには、0~1の位置(実数)と、その位置における色を指定する。

以下の例では、8個のプッシュボタンをグラデーションにしている。

 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
 {
    ui->setupUi(this);
 
   // 左上から右下(白->黒)
   ui->pushButton_1->setStyleSheet(QStringLiteral(
      "background-color: qlineargradient(x1:0, y1:0, x2:1, y2:1,"
      "stop:0 rgb(255, 255, 255), stop:1 rgb(0, 0, 0));"));
 
   // 上から下(白->黒)
   ui->pushButton_2->setStyleSheet(QStringLiteral(
      "background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,"
      "stop:0 rgb(255, 255, 255), stop:1 rgb(0, 0, 0));"));
 
   // 右上から左下(白->黒)
   ui->pushButton_3->setStyleSheet(QStringLiteral(
      "background-color: qlineargradient(x1:1, y1:0, x2:0, y2:1,"
      "stop:0 rgb(255, 255, 255), stop:1 rgb(0, 0, 0));"));
 
   // 右から左(白->黒)
   ui->pushButton_4->setStyleSheet(QStringLiteral(
      "background-color: qlineargradient(x1:1, y1:0, x2:0, y2:0,"
      "stop:0 rgb(255, 255, 255), stop:1 rgb(0, 0, 0));"));
 
   // 右下から左上(白->黒->白)
   ui->pushButton_5->setStyleSheet(QStringLiteral(
      "background-color: qlineargradient(x1:1, y1:1, x2:0, y2:0,"
      "stop:0 rgb(255, 255, 255), stop:0.5 rgb(0, 0, 0), stop:1 rgb(255, 255, 255));"));
 
   // 下から上(白->黒->白)
   ui->pushButton_6->setStyleSheet(QStringLiteral(
      "background-color: qlineargradient(x1:0, y1:1, x2:0, y2:0,"
      "stop:0 rgb(255, 255, 255), stop:0.5 rgb(0, 0, 0), stop:1 rgb(255, 255, 255));"));
 
   // 左下から右上(白->黒->白)
   ui->pushButton_7->setStyleSheet(QStringLiteral(
      "background-color: qlineargradient(x1:0, y1:1, x2:1, y2:0,"
      "stop:0 rgb(255, 255, 255), stop:0.5 rgb(0, 0, 0), stop:1 rgb(255, 255, 255));"));
 
   // 左から右(白->黒->白)
   ui->pushButton_8->setStyleSheet(QStringLiteral(
      "background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0,"
      "stop:0 rgb(255, 255, 255), stop:0.5 rgb(0, 0, 0), stop:1 rgb(255, 255, 255));"));
 }



トグルボタンの作成

まず、Qt Designer画面にて、プッシュボタンを配置して、QPushButtonクラスのcheckableプロパティにチェックを入力する。

次に、配置したプッシュボタンを右クリックして[スロットへ移動]を選択する。
プッシュボタンのシグナルにおいて、clicked(bool)またはtoggled(bool)を選択する選択して、スロット関数を作成する。

プッシュボタンの押下において、clicked(bool)シグナルもtoggled(bool)シグナルも同じように呼び出されるが、
ただし、以下のように、ソースコードから操作する場合は、差異がある。

  • ui->pushButton->setChecked(true);
    toggled(bool)は呼び出されるが、clicked(bool)は呼び出されない。

    例えば、親ボタン1と子ボタン1-1、1-2、1-3がある時、
    "親ボタンを押下すると、子ボタンを全て押下状態にする"
    "親ボタンが押下されていない状態で、子ボタンが全て押下されると、親ボタンも押下状態にする"
    ような場合の2で、親ボタンの押下状態だけを変える場合等。


  • ui->pushButton->click();
    toggled(bool)clicked(bool)も呼び出される。(UI操作でボタンを押下したのと同様)



画像の表示

プッシュボタンの画像

プッシュボタンは、画像とテキストが表示できる。

画像の位置は固定、画像のサイズは指定可能であり、テキストの左側に表示される。
プッシュボタンコントロールのサイズを変更しても、画像のサイズは自動的に変化しない。

画像のサイズを指定しない場合は、原画像のサイズで表示される。

 std::unique_ptr<QPushButton> pBtn = std::make_unique<QPushButton>();
 
 pBtn->setIcon(style()->standardIcon(QStyle::SP_ArrowDown));
 pBtn->setText(tr("Test"));
 pBtn->setIconSize(QSize(32, 32));
 pBtn->setFont(QFont("Meiryo", 18));


フレーム画像

背景画像ではなく境界画像を指定する場合、サイズ変更に対応した枠を表示できる。

 std::unique_ptr<QPushButton> pBtn = std::make_unique<QPushButton>();
 
 pBtn->setText(tr("Test"));
 pBtn->setStyleSheet(
                       "border-width:27px; padding:10px; color:red;"
                       "background-image:url(:/images/close-hover.gif); background-color:skyblue;"
                       "border-image:url(:/images/border.png) 27 repeat;");


下図左は、border.pngファイルである。
黒い箇所が透過の場合、背景色と背景画像が見える。
repeatを指定しない場合は、引き伸ばした画像に変換される。

原画像を9分割して組み合わせることにより、境界線の長さの変化に対応することができる。
下図中央の緑の部分が、border-widthで指定した27pxの境界である。
②④⑥⑧の画像は、タイプにしたがって引き伸ばしたり、タイル状に敷き詰めたりする。

例えば、border-imageの幅を54に変更する時、左上・右上・左下・右下の四隅は、以下のようになる。
上下左右の境界画像は、②④⑥⑧に対応する部分が足りなくなるため、表示されない。

  • 左上
    ① + ② + ④ + ⑤
  • 右上
    ② + ③ + ⑤ + ⑥
  • 左下
    ④ + ⑤ + ⑦ + ⑧
  • 右下
    ⑤ + ⑥ + ⑧ + ⑨


border-imageは、最初に画像データを指定する必要がある。その他の項目はどちらを先に記述しても構わない。

下表に、境界画像(border-image)の設定例を示す。
image-widthの指定方法は、CSSのmarginプロパティと同様である。

項目 初期値 設定例 説明
画像データ
(image-source)
none url(:/images/border.png)
url(C:/temp/frame.gif)
リソース画像
画像ファイル
幅と高さ
(image-width)
1 20
2em 5% 3
上下左右20px
上2em、左右5%、下3px
タイプ
(image-repeat)
stretch round
repeat stretch
縦横ともに均等タイル
横方向はタイル、縦方向は伸縮


タイプの種類は、タイル(repeat)、均等タイル(round)、伸縮(stretch)の3種類がある。

例えば、上図②の場合、タイル(repeat)は単純に②を並べるため、途中で画像が切れることがある。
均等タイル(round)は、②を何個表示できるかを計算して、均等になるように②の幅を伸縮する。(端数は四捨五入)


プッシュボタンのフレーム

背景としてフレーム画像を指定する場合、プッシュボタンのサイズ変更に対応できない。

 button->setStyleSheet(
                         "background:skyblue url(:/images/frame.png) no-repeat;");


境界としてフレーム画像を指定することにより、プッシュボタンのサイズ変更に対応することができる。

 button->setStyleSheet(
                         "border-width:4px; background-color:skyblue;"
                         "border-image:url(:/images/frame.png) 4;");