我必须在Qt中创建一个屏幕,我必须在其中显示一个遥控器,其中有许多按钮,当用户点击实际遥控器上的某个按钮时,图像中的相应按钮会突出显示。所以我所做的是,我使用QLabel
并将远程图像设置为背景图像,然后我为每个按钮添加了小矩形标签,并用半透明颜色填充它们,当用户在实际远程标签中单击按钮时颜色变化,但通过使用这种方法,许多标签被用来使代码看起来效率低下,所以我想在QLabel
上绘制(它有一个遥控器作为背景图像)而不是按钮。
有人可以建议我,我应该使用Qt的API,以及如何跟进?
答案 0 :(得分: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_()
这是一个粗略的例子。您可以通过绘制文本进行更精细的调整。此小部件采用标签字符串和图片路径,并将图片绘制为背景,将文本绘制为标签。您可以在paint事件以及自定义信号和事件中使用此自定义窗口小部件执行任意数量的操作。
答案 1 :(得分:1)
我使用此代码在Label中绘制图像: 图像在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();
}