2012-09-03 44 views
1

我必须在Qt中创建一个屏幕,在这个屏幕中我必须显示一个有很多按钮的遥控器,并且当用户单击实际遥控器上的某个按钮时,图像中相应的按钮会突出显示。所以我所做的是,我已经使用QLabel并将远程图像设置为背景图像,然后我为每个按钮放置了一个小矩形标签,并填充半透明颜色,当用户单击实际远程标签颜色变化时的按钮,但通过使用这种方法,大量的标签被越来越多地使用,使得代码看起来效率低下,所以我想通过按钮在QLabel(它有一个远程作为背景图像)上绘图。如何在Qt中绘制QLabel

有人可以建议我,我应该使用Qt的哪个API,以及如何跟踪此问题?

+2

你说的低效的代码是什么意思? –

+0

[图形视图框架](http://doc.qt.digia.com/qt/graphicsview.html),但除非你的遥控器真的很大,普通按钮应该工作得很好。 – Mat

回答

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_() 

这是一个粗略的例子。通过绘制文字,您可以更好地进行调整。这个小部件需要一个标签字符串和一个图片路径,并将该图片绘制为背景,将该文本绘制为标签。您可以在绘制事件中使用此自定义小部件执行任意数量的操作,也可以使用自定义信号和事件。

1

我已经使用这个代码绘制了图像的标签: 图像加载在用户界面和代码如下在的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(); 
}