1

我必须在 Qt 中创建一个屏幕,在其中我必须显示一个遥控器,其中有很多按钮,当用户单击实际遥控器上的某个按钮时,图像中的相应按钮会突出显示。所以我所做的是,我已经使用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 中加载,代码如下在paintevent中

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 回答