1

Qtで1つの画面を作成する必要があり、その中にたくさんのボタンがあるリモコンを表示する必要があり、ユーザーが実際のリモコンのボタンをクリックすると、画像の対応するボタンが強調表示されます。だから私がしたことは、QLabelリモート画像を背景画像として使用して設定し、各ボタンに小さな長方形のラベルを付けて半透明の色で塗りつぶし、ユーザーが実際のリモートラベルの色のボタンをクリックすると色が変わることですが、この方法を使用すると、多くのラベルが使用されてコードが非効率的に見えるため、QLabelボタンの上に(背景画像としてリモコンがある)描画することを考えていました.

Qt のどの API を使用すればよいか、またこれをフォローアップする方法を教えてもらえますか?

4

2 に答える 2

2

QGraphics は完全にカスタムのグラフィカル インターフェイスの正しいルートだと思いますが、既存のアプローチをあまり変更する必要のない何かを試してみたい場合は、カスタム ペイント イベントを使用してウィジェットを作成できます。

これは PyQt で書かれていますが、簡単に Qt に変換できます

from PyQt4 import QtCore, QtGui

class LabelButton(QtGui.QWidget):

    clicked = QtCore.pyqtSignal()

    def __init__(self, labelStr, pixStr, parent=None):
        super(LabelButton, self).__init__(parent)
        self.label = labelStr
        self.pix = QtGui.QPixmap(pixStr)

    def paintEvent(self, event):
        super(LabelButton, self).paintEvent(event)
        rect = event.rect()
        painter = QtGui.QPainter(self)

        painter.drawPixmap(rect, self.pix)

        pos = (rect.bottomLeft()+rect.bottomRight()) / 2
        pos.setY(pos.y()-10)
        painter.drawText(pos, self.label)

        painter.end()

    def mousePressEvent(self, event):
        event.accept()
        self.clicked.emit()

def handleClick():
    print "CLICK"


if __name__ == "__main__":
    app = QtGui.QApplication([])
    widget = LabelButton("A Text Label", "myImage.png")
    widget.resize(600,400)
    widget.show()
    widget.raise_()

    widget.clicked.connect(handleClick)

    app.exec_()

これは大まかな例です。テキストの描画をより細かく調整できます。このウィジェットは、ラベル文字列と画像パスを受け取り、画像を背景として、テキストをラベルとして描画します。ペイント イベントとカスタム シグナルおよびイベントの両方で、このカスタム ウィジェットを使用してさまざまなことを行うことができます。

于 2012-11-24T16:55:52.420 に答える
1

このコードを使用して、ラベルの画像を描画しました。画像は Ui に読み込まれ、コードは次のとおりです。

void ColorTab::paintEvent(QPaintEvent *e){ 

ui->lbl_capture_img->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
ui->Lbl_color_tab_WG->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);

Cap_Image = QImage(ui->lbl_capture_img->pixmap()->toImage());
Lbl_Image = QImage(ui->Lbl_color_tab_WG->pixmap()->toImage());

QPainter painter_Lbl(&Lbl_Image);
QPainter painter_Cap(&Cap_Image);

QPen pen(Qt::white, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin);
painter_Lbl.setPen(pen);
painter_Cap.setPen(pen);
painter_Lbl.drawPolygon(blinkRect_Lbl);
painter_Cap.drawPolygon(blinkRect_Cap);
ui->lbl_capture_img->setPixmap(QPixmap::fromImage(Cap_Image));
ui->Lbl_color_tab_WG->setPixmap(QPixmap::fromImage(Lbl_Image));

painter_Cap.end();
painter_Lbl.end();
}
于 2016-08-30T06:48:22.227 に答える