Qtで高速でウィジェットを切り替えるには?

今回は、同じ場所に設置されているウィジェットを切り替える方法を紹介します。 QStackedWidget *stack = new QStackedWidget(this); stack->addWidget(page1); stack->addWidget(page2); stack->addWidget(page3); // 切り替え stack->setCurrentIndex(1); QStackedWidgetを使えば、簡単に切り替えできます。 しかも、メモリにもCPUにも優しいです。

2026年1月14日

QtのQPushButtonにJSのホバーみたいなイベントを実装するには?

シグナルでのJSのホバーイベントみたいなやつはなかったようなので、 以下の方法で、JSのmouseenter、mouseoverみたいなやつを実装します。 結論 : サブクラスでオーバーライド class HoverButton : public QPushButton { Q_OBJECT public: using QPushButton::QPushButton; protected: void enterEvent(QEnterEvent* event) override { qDebug() << "hover enter"; QPushButton::enterEvent(event); } void leaveEvent(QEvent* event) override { qDebug() << "hover leave"; QPushButton::leaveEvent(event); } }; おまけ : シグナル付き ホバーの実装例 : class HoverButton : public QPushButton { Q_OBJECT public: using QPushButton::QPushButton; protected: void enterEvent(QEnterEvent* event) override { emit mouseEnter(); QPushButton::enterEvent(event); } void leaveEvent(QEvent* event) override { emit mouseOver(); QPushButton::leaveEvent(event); } signals: void mouseEnter(); void mouseOver(); }; 接続、connect例 : ...

2026年1月13日

Qt6のQPushButtonとデータを結びつけるには?

今回は例として、enumの値を代入します。 設定の例 enum class ActionType { Open, Save, Close }; QPushButton* btn = new QPushButton("Open"); // enum → int にして保存 btn->setProperty("action", static_cast<int>(ActionType::Open)); 取得の例 void MainWindow::onButtonClicked() { QPushButton* btn = qobject_cast<QPushButton*>(sender()); if (!btn) return; ActionType action = static_cast<ActionType>(btn->property("action").toInt()); switch (action) { case ActionType::Open: qDebug() << "Open"; break; case ActionType::Save: qDebug() << "Save"; break; case ActionType::Close: qDebug() << "Close"; break; } } シグナルの接続 connect(btn, &QPushButton::clicked, this, &MainWindow::onButtonClicked);

2026年1月13日

Qt6のQSliderで100%に吸着させるには?

1. 準備 QSlider *slider = new QSlider(Qt::Horizontal); slider->setRange(-1000, 1000); slider->setValue(0); 2. 実装 connect(slider, &QSlider::sliderReleased, this, [slider]() { if (std::abs(slider->value()) < 30) slider->setValue(0); });

2026年1月8日

Qt6のQSliderで対数スケールを行うには?

実装例 今回はズーム(%)のスライダーを想定した例です。 10~800%まで対応 1. スライダー設定 QSlider *slider = new QSlider(Qt::Horizontal); slider->setRange(-1000, 1000); slider->setValue(0); // 中央 = 100% slider->setSingleStep(1); slider->setPageStep(50); 2. 対数変換関数 static double sliderToZoom(int v) { // v=-1000 → 0.1 // v=0 → 1.0 // v=1000 → 8.0 const double minZoom = 0.1; const double maxZoom = 8.0; if (v >= 0) { return std::pow(maxZoom, v / 1000.0); } else { return std::pow(minZoom, -v / 1000.0); } } 3. 表示(%)に変換 connect(slider, &QSlider::valueChanged, this, [label](int v) { double zoom = sliderToZoom(v); int percent = qRound(zoom * 100); label->setText(QString("%1%").arg(percent)); });

2026年1月8日

Qtでセパレーター(Separater)を作成するには?

QLabel *separater = new QLabel; separater->setFixedWidth(1); separater->setStyleSheet("background-color: #888; margin-left: 4px; margin-right: 4px;"); ...

2026年1月7日

QtのQToolButtonにおいてチェックは出来ても解除は出来ないようにする

前提 QToolButton* button = new QToolButton; button->setCheckable(true); QToolButtonでチェック可能にする 1. OFFにされそうになったら即戻す connect(button, &QToolButton::toggled, this, [button](bool checked) { if (!checked) { // ユーザー操作による解除を拒否 button->setChecked(true); } }); ...

2026年1月7日

QtのQListWidgetにおいてアイテムのない部分をクリックしても選択が解除されないようにする

mousePressEvent をオーバーライド class NoClearListWidget : public QListWidget { Q_OBJECT public: using QListWidget::QListWidget; protected: void mousePressEvent(QMouseEvent* event) override { QModelIndex index = indexAt(event->pos()); // アイテムがない場所をクリックしたら無視 if (!index.isValid()) { event->ignore(); return; } QListWidget::mousePressEvent(event); } };

2026年1月7日

QtでQIconからQPixmapに変換するには?

1.一般的 QPixmap pixmap = icon.pixmap(32, 32); 2. デバイスピクセル比(HiDPI対応) QPixmap pixmap = icon.pixmap(QSize(32, 32), QIcon::Normal, QIcon::Off); ...

2026年1月6日

Qtでステータスバーにウィジェットを追加するには?

1. 基本例(QMainWindow, 左端に固定) #include <QMainWindow> #include <QStatusBar> #include <QLabel> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QLabel *statusLabel = new QLabel("準備完了"); statusBar()->addWidget(statusLabel); } 2. 右端に固定 QLabel *permanentLabel = new QLabel("v1.0.0"); statusBar()->addPermanentWidget(permanentLabel); 一時メッセージを表示 statusBar()->showMessage("保存しました", 3000); //3000ミリ秒 ステータスバーの作成 setStatusBar(new QStatusBar(this));

2026年1月3日