2011-09-11 26 views
5

Tôi có một số QStackedWidget chứa một số trang đầy đủ các số khác nhau QLineEditQComboBox trẻ em. Tôi muốn phát ra tín hiệu bất cứ khi nào QStackedWidget không còn có bất kỳ trẻ nào trẻ em có tiêu điểm (được cho là trẻ tập trung bắt đầu). Vì vậy, di chuyển từ trẻ em sang trẻ em sẽ không phát ra tín hiệu, nhưng khi một widget được chọn bên ngoài của QStackedWidget, một tín hiệu được phát ra. Bất kỳ lời khuyên nào về cách thực hiện điều này? Tôi đã xem số InstallEventFilterQSignalMapper, nhưng cả hai đều không phù hợp với nhu cầu của tôi. Lời khuyên nào sẽ được đánh giá cao.Tín hiệu phát ra nếu tất cả các tiện ích con bị mất tiêu điểm

Trả lời

2

Đây là một chút khó khăn. Ngay cả khi đạp xe từ trẻ em sang trẻ em, có một khoảng thời gian ngắn sau khi trẻ bị mất tập trung và trước khi một đứa trẻ khác tập trung mà không có trẻ em nào của tiện ích xếp chồng lên nhau tập trung. Mặc dù trạng thái này cực kỳ ngắn ngủi, nhưng đó là vấn đề thực tế. Tùy chọn duy nhất tôi có thể thấy là quyết định khoảng thời gian giữa một tiện ích con bị mất tiêu điểm và không có tiện ích con nào lấy tiêu điểm bạn sẽ coi là đủ dài để tuyên bố rằng, không có tiện ích con nào tập trung nữa. Đây sẽ là một cơ chế tương tự như những gì được sử dụng để phân biệt hai lần nhấp chuột duy nhất từ ​​một cú nhấp đúp.

Điều này có thể đạt được bằng cách sử dụng bộ hẹn giờ và bộ lọc sự kiện trong phụ huynh đã đăng ký với từng trẻ, sẽ tìm kiếm sự kiện lấy nét và tham gia. Đặt hẹn giờ cho một khoảng thời gian (100 ms?) Và khởi động nó bất cứ khi nào một sự kiện lấy nét được nhận. Nếu bạn nhận được tiêu điểm trong sự kiện trong khi bộ hẹn giờ vẫn đang chạy, hãy ngừng bộ hẹn giờ. Nếu bộ hẹn giờ hoàn tất, bạn có thể kích hoạt tín hiệu của riêng mình để cho biết rằng không có tiện ích con nào được tập trung.

+1

Điều này làm việc hoàn hảo, cảm ơn bạn! – Jmbryan10

4

Bạn có thể kết nối với tín hiệu QApplication :: focusChanged để đánh giá các tiện ích tiêu điểm trong một vị trí tương ứng. Cách sạch để làm điều này là xuất phát từ QStackedWidget:

class StackedFocusWidget : public QStackedWidget { 

    Q_OBJECT 

public: 

    StackedFocusWidget(QWidget *parent = 0) : QStackedWidget(parent) { 
     connect(qApp, SIGNAL(focusChanged(QWidget *, QWidget *)), this, SLOT(onFocusChanged(QWidget *, QWidget *))); 
    } 

private slots: 

    void onFocusChanged(QWidget *old, QWidget *now) { 
     bool focusOld = old != 0 && isAncestorOf(old); 
     bool focusNow = now != 0 && isAncestorOf(now); 
     if (!focusOld && focusNow) { 
      emit gotFocus(); 
     } else if (focusOld && !focusNow) { 
      emit lostFocus(); 
     } 
    } 

signals: 

    void gotFocus(); 
    void lostFocus(); 
}; 

Các tín hiệu StackedFocusWidget :: GotFocus và StackedFocusWidget :: lostFocus sẽ được phát ra bất cứ khi nào widget xếp chồng lên nhau hoặc bất kỳ Childs của nó nhận được hoặc mất tập trung.

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