2011-10-28 24 views
12

Tôi đang tìm kiếm thứ gì đó giống như tín hiệu đã hoàn thành từ QDialog, chỉ dành cho QWidget. Lý do là, tôi vô hiệu hóa thanh công cụ của tôi một khi các phụ tùng bật lên (mà không phải là một vấn đề ở tất cả) và tôi muốn thanh công cụ được kích hoạt một lần nữa, một khi các widget được đóng lại.Cần một thứ gì đó giống như tín hiệu đã hoàn thành từ QWidget

Tôi cũng không thể ghi đè sự kiện gần đúng của tiện ích con đó, vì sau đó chúng tôi sẽ có mã GUI trong các lớp kinh doanh.

+1

Phát ra tín hiệu từ tiện ích con? Hoặc bắt tín hiệu 'bị phá hủy()'? – RedX

+2

Dòng cuối cùng của bạn không thực sự hợp lý. Một widget là một mục GUI, sự kiện đóng của nó là mã GUI. Tại sao sẽ ghi đè điều đó gây ra sự kết hợp giữa GUI và logic nghiệp vụ? – Mat

Trả lời

14

Bạn có thể đặt các widget được xóa trên gần, và sau đó lắng nghe tín hiệu destroyed của nó:

widget->setAttribute(Qt::WA_DeleteOnClose); 
connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(widgetDestroyed(QObject*))); 

Đó chỉ hoạt động nếu bạn không quan tâm đến nội dung widget. Tại thời điểm destroyed() được phát ra, tiện ích không còn là QWidget nữa, chỉ cần QObject (như destroyed() được phát ra từ ~QObject), vì vậy bạn không thể bỏ đối số QObject* đến QWidget nữa.

Cách thay thế đơn giản có thể là bọc tiện ích của bạn với QDialog.

+0

cái đầu tiên hoạt động khá tốt, cảm ơn bạn. – LarissaGodzilla

+0

Xin chào Frank, làm cách nào để triển khai vị trí 'widgetDestroyed'? – SexyBeast

+0

Điều đó phụ thuộc vào những gì bạn muốn làm khi tiện ích bị hủy, không có câu trả lời chung nào phải làm trong khe. –

0

QWidget không có nhiều tín hiệu thực sự, theo tài liệu có tổng cộng 2. Tuy nhiên, điều đó không có nghĩa là bạn không thể chỉ định tín hiệu và sử dụng nó, có lẽ là phương pháp tốt nhất .

9

Trong lớp Widget, bạn có thể thêm tín hiệu của riêng mình mà người khác có thể kết nối. Sau đó ghi đè phương thức closeEvent(). Đừng lo lắng về việc ghi đè phương pháp này, loại tình huống này chính xác là lý do chính đáng làm cho nó.

class MyCustomWidget: public QWidget 
{ 
    Q_OBJECT 

    ... 

    signals: 
     void WidgetClosed(); 

    protected: 

    //=============================================================== 
    // Summary: Overrides the Widget close event 
    // Allows local processing before the window is allowed to close. 
    //=============================================================== 
    void closeEvent(QCloseEvent *event); 

    } 

Trong phương pháp closeEvent kích hoạt tín hiệu của bạn:

void MyCustomWidget::closeEvent(QCloseEvent *event) 
{ 
     emit WidgetClosed(); 
     event->accept(); 
} 
+0

Tôi đã làm điều đó rồi, nhưng vì một lý do nào đó mà tôi có thể không hiểu cũng như tôi nghĩ rằng tôi có, đội trưởng của tôi không muốn nó theo cách đó. Nhưng tôi sẽ nói chuyện với anh ta về điều đó, thấy rằng những cách khác có thể làm cho ít ý nghĩa hơn. – LarissaGodzilla

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