2012-02-13 56 views
5

Gần đây, tôi muốn rằng QPushButton có thể phát ra tín hiệu khi con trỏ chuột vào. Làm thế nào tôi có thể làm cho nó?Làm thế nào để phát ra tín hiệu từ QPushButton khi chuột di chuột qua nó?

Tôi biết rằng QPushButton có một số tín hiệu đã được xác định, chẳng hạn như clicked(), pressed(), destory() v.v. Nhưng không có tín hiệu như hover(), nhập(), ...

Tôi đã xem một số thông tin về nó: Ai đó nói rằng nó có thể được thực hiện bởi css. Tôi không hiểu. Bạn có thể cho tôi một lời khuyên ? Cảm ơn bạn!

+0

Nếu bạn có thể giải thích điều bạn muốn làm khi di chuột, có thể không cần thiết để chặn sự kiện như vậy. Ví dụ: nếu bạn muốn thay đổi giao diện của nút, bạn có thể thực hiện việc này bằng một biểu định kiểu. –

+0

Cảm ơn bạn .. Tôi muốn làm điều đó: Nếu có hai thành phần, khi con trỏ chuột di chuột lên một phần, con kia là không thể xem được ... –

+1

Ok, vì bạn muốn ảnh hưởng đến một nút dựa trên tương tác chuột với nút khác, bạn thực sự cần phải chặn sự kiện này. –

Trả lời

7

Bạn có thể sử dụng QWidget::enterEvent (QEvent * event) cho việc này.

Bạn ghi đè sự kiện này và gửi tín hiệu được xác định tùy chỉnh khi sự kiện này xảy ra.

Trước tiên, bạn phải bật theo dõi chuột cho tiện ích con này (ví dụ: setMouseTracking(true) trong hàm tạo).

tập tin tiêu đề: tập tin

class my_button 
{ 
    // ... 

protected: 
    virtual void enterEvent(QEvent* e); 

public Q_SIGNALS: 
    void hovered(); 

    // ... 
}; 

Nguồn:

void my_button::enterEvent(QEvent* e) 
{ 
    Q_EMIT hovered(); 

    // don't forget to forward the event 
    QWidget::enterEvent(e); 
} 

Trong trường hợp bạn sử dụng nút bấm của bạn:

connect(one_of_my_button, SIGNAL(hovered()), this, SLOT(do_something_when_button_hovered())); 
+0

trước hết 、 Cảm ơn bạn. Tôi nghĩ rằng đó là một chút khó chịu, Bởi vì tôi chỉ sử dụng một nút như vậy, Có cách nào khác không? –

1

Nếu tôi nhớ chính xác, bạn cần bật theo dõi chuột cho nút (Qt documentation) và ghi đè QWidget::onEnter()QWidget::onLeave().

Bạn sẽ cần tạo lớp nút tùy chỉnh kế thừa từ QPushButton. Bạn có thể xác định tín hiệu cho mouseEnter và mouseLeave trong lớp tùy chỉnh của bạn và phát ra chúng từ các phương thức onEnter()onLeave() mà bạn cần ghi đè.

+0

Phải được ghi đè? Cảm ơn bạn đã giúp tôi ... –

+1

Có, bạn phải triển khai hàm onEnter() và onLeave() trong lớp nút tùy chỉnh của bạn. Xem câu trả lời của @ Exa cho ví dụ về mã. ps. xin vui lòng bỏ phiếu nếu bạn tìm thấy một câu trả lời hữu ích – dirk

3

Hãy chắc chắn để thêm ':' sau từ khóa nào

public: Q_SIGNALS: 
    void hovered(); 
6

Mặc dù @Exa đã trả lời câu hỏi này, tôi muốn hiển thị một giải pháp khác mà không cần phải phân lớp QPushButton và linh hoạt trong sử dụng! (Đó là những gì tôi cần trong dự án của tôi)

Bước 1/2: Ghi đè sự kiệnFilter.

LoginWindow.h:

// LoginWindow is where you placed your QPushButton 
//(= most probably your application windows) 

class LoginWindow: public QWidget 
{ 
public: 
     bool eventFilter(QObject *obj, QEvent *event); 
.. 
}; 

LoginWindow.cpp:

bool LoginWindow::eventFilter(QObject *obj, QEvent *event) 
{ 
    // This function repeatedly call for those QObjects 
    // which have installed eventFilter (Step 2) 

    if (obj == (QObject*)targetPushButton) { 
     if (event->type() == QEvent::Enter) 
     { 
     // Whatever you want to do when mouse goes over targetPushButton 
     } 
     return true; 
    }else { 
     // pass the event on to the parent class 
     return QWidget::eventFilter(obj, event); 
    } 
} 

Bước 2/2: Cài đặt eventFilter trên widget mục tiêu.

LoginWindow::LoginWindow() 
{ 
    ... 
    targetPushButton->installEventFilter(this); 
    ... 
} 
+0

Đây là câu trả lời rất hay. Nhưng đối với một số lý do kỳ lạ, khi tôi áp dụng logic này trên một 'QToolButton' (để hiển thị một số văn bản tùy chỉnh bật lên trên nó), nút trở nên vô hình, mặc dù lơ lửng trên nơi nó được cho là tiết lộ popup tất cả các quyền, và ngay cả con trỏ cũng trở thành con trỏ như mong đợi, vì tôi đặt nó như thế cho nút! – SexyBeast

+0

Hoàn hảo! Tôi không muốn tạo một lớp mới cho mỗi widget mà tôi muốn phát hiện các sự kiện di chuột! – BuvinJ

+2

@Cupidvogel Tôi nghĩ rằng tôi đã tìm ra nguyên nhân. Thay vì 'return true' trong hàm' eventFilter', sử dụng 'return QWidget :: eventFilter (obj, event);' và một cũng không cần điều kiện khác. Tôi đã làm điều này và tình trạng nút biến mất biến mất. – Volomike

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