2010-03-08 84 views

回答

5

您可以在QObject實例上安裝event filter
因此,如果您想要通知windowsTitle更改,則可以安裝捕獲QEvent :: WindowTitleChange事件的eventfilter。
例如:

class WindowsTitleWatcher : public QObject 
{ 
    Q_OBJECT 
public: 
    WindowsTitleWatcher(QObject *parent) : QObject(parent) { 
    } 

signals: 
    void titleChanged(const QString& title); 

protected: 
    bool eventFilter(QObject *obj, QEvent *event){ 
     if(event->type()==QEvent::WindowTitleChange) { 
      QWidget *const window = qobject_cast<QWidget *>(obj); 
      if(window) 
       emit titleChanged(window->windowTitle()); 
     } 
     return QObject::eventFilter(obj, event); 
    } 
}; 

//... 
QDialog *const dialogToWatch = ...; 
QObject *const whoWantToBeNotified = ...; 
QObject *const titleWatcher = new WindowsTitleWatcher(dialogToWatch); 
whoWantToBeNotified->connect(
    titleWatcher, 
    SIGNAL(titleChanged(QString)), 
    SLOT(onTitleChanged(QString))); 
dialogToWatch->installEventFilter(titleWatcher); 

//... 
+0

哈,我一定是失明的。我正在查看事件文檔並閱讀所有內容,但事件發生了。謝謝。 – darkadept 2010-03-11 14:25:58

0

我對「語言」並不熟悉,但總的來說,您希望遵循Observer設計模式。您看到,在這種模式中,您所做的是將觀察者註冊到可觀察對象,即QObject。在Observable對象內部,您將跟蹤其觀察者列表。當QObject的狀態發生變化時,您可以使用觀察者列表通知所有觀察者......實際上,您創建了一個觀察者可以實現的接口......此接口將成爲您通知可觀察對象的不同觀察者。只是一個想法!

+0

這是正確的想法,但我不能改變的QObject,因爲它是我使用的庫的一部分。我編輯了我的問題來澄清這個事實。 – darkadept 2010-03-08 07:25:20

+0

但是你可以從它創建一個子類,:)讓子類成爲你的Observable對象... – ultrajohn 2010-03-08 07:33:04

+0

在Qt中,你可以使用內置的信號槽機制來實現觀察者模式。 – TimW 2010-03-08 09:04:41

6

對於動態屬性,可以使用QDynamicPropertyChangeEvent

希望它有幫助!

+0

我試圖去看QWidget的windowTitle屬性,但是因爲那不是一個動態屬性,它不會觸發該事件。我最終使用了一個動態事件來傳遞我的信息,它像一個魅力一樣工作。謝謝! – darkadept 2010-03-08 08:13:04

+1

使用setProperty(name,value)設置屬性,而不是屬性設置器來獲取屬性更改通知。 – puetzk 2012-10-10 16:36:11