2010-04-26 35 views

Trả lời

4

Tôi đã thấy rất nhiều người gặp vấn đề này và quyết định viết một ví dụ thích hợp về cách khắc phục. Bạn có thể tìm thấy nó ở đây: An example on how to make QLabel clickable Giải pháp trong bài đăng của tôi giải quyết vấn đề bằng cách mở rộng QLabel để nó phát ra tín hiệu được nhấp(). QLabel mở rộng trông giống như sau:

class ExtendedQLabel(QLabel): 

    def __init__(self, parent): 
     QLabel.__init__(self, parent) 

    def mouseReleaseEvent(self, ev): 
     self.emit(SIGNAL('clicked()')) 

Tôi hy vọng điều này sẽ hữu ích!

+1

Vấn đề với giải pháp này là sự kiện phát hành chuột không phải là nhấp chuột. Để có một cú click chuột phải xuống và lên trong cùng một widget. Nếu không, người dùng có thể đã bắt đầu nhấp vào một nơi khác, thay đổi ý định của họ và di chuyển chuột ra khỏi nút-họ-không-muốn-nhấp-và trên cái này. Sự ngạc nhiên! –

3

Một cái gì đó như thế này, có thể?

import sys 

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

app = QApplication(sys.argv) 
widget = QWidget() 
layout = QHBoxLayout() 
widget.setLayout(layout) 
button = QPushButton() 
layout.addWidget(button) 
icon = QIcon("image.png") 
button.setIcon(icon) 
widget.show() 
app.exec_() 
+0

có nó hoạt động, bu Tôi không muốn một hình ảnh bên trong nút, tôi muốn, một hình ảnh như thay thế một nút – Alquimista

18

Bạn có thể phân lớp QAbstractButton và tạo nút của riêng bạn. Dưới đây là một ví dụ đơn giản cơ bản:

import sys 
from PyQt4.QtGui import * 

class PicButton(QAbstractButton): 
    def __init__(self, pixmap, parent=None): 
     super(PicButton, self).__init__(parent) 
     self.pixmap = pixmap 

    def paintEvent(self, event): 
     painter = QPainter(self) 
     painter.drawPixmap(event.rect(), self.pixmap) 

    def sizeHint(self): 
     return self.pixmap.size() 

app = QApplication(sys.argv) 
window = QWidget() 
layout = QHBoxLayout(window) 

button = PicButton(QPixmap("image.png")) 
layout.addWidget(button) 

window.show() 
sys.exit(app.exec_()) 

Đó không phải là cách siêu dễ dàng, nhưng nó mang lại cho bạn nhiều quyền kiểm soát. Bạn có thể thêm pixmap thứ hai và vẽ nó chỉ khi con trỏ chuột di chuột qua nút. Bạn có thể thay đổi hành vi kéo dài hiện tại thành trung tâm. Bạn có thể làm cho nó có không phải là một hình chữ nhật và vân vân ...

Nút rằng những thay đổi hình ảnh trên di chuột và khi ép:

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

class PicButton(QAbstractButton): 
    def __init__(self, pixmap, pixmap_hover, pixmap_pressed, parent=None): 
     super(PicButton, self).__init__(parent) 
     self.pixmap = pixmap 
     self.pixmap_hover = pixmap_hover 
     self.pixmap_pressed = pixmap_pressed 

     self.pressed.connect(self.update) 
     self.released.connect(self.update) 

    def paintEvent(self, event): 
     pix = self.pixmap_hover if self.underMouse() else self.pixmap 
     if self.isDown(): 
      pix = self.pixmap_pressed 

     painter = QPainter(self) 
     painter.drawPixmap(event.rect(), pix) 

    def enterEvent(self, event): 
     self.update() 

    def leaveEvent(self, event): 
     self.update() 

    def sizeHint(self): 
     return QSize(200, 200) 
+0

cảm ơn, tôi sẽ đọc thêm abot subclassing QAbstractButton – Alquimista

+2

Tôi thấy đây là lần đầu tiên 'true' giải pháp tôi đã tìm thấy. Rõ ràng và rực rỡ. –

+0

Tôi rất mới với PySide/PyQt và tôi đã xem qua điều này, điều này rất hữu ích. Nhưng tôi không thể tìm ra cách thêm bản đồ thứ hai khi nút được nhấn hoặc khi chuột di chuyển. Nó sẽ có thể cho bạn để xây dựng trên đó? Cảm ơn. – oxtay

1

Một lựa chọn khác là sử dụng stylesheets. Một cái gì đó như:

from PyQt4 import QtCore, QtGui 
import os 
... 

path = os.getcwd() 
self.myButton.setStyleSheet("background-image: url(" + path + "/myImage.png);") 
3

Bạn có thể sử dụng QToolButton với thiết lập thuộc tính autoraise true và ở đó bạn cũng có thể đặt hình ảnh của mình.

Các vấn đề liên quan