2013-02-06 41 views
5

Tôi có một Câu hỏi Qt đơn giản. Tôi muốn rằng các file UIC tự động tạo ra có nguồn gốc từ một lớp giao diện tùy chỉnh như trong:Bắt nguồn từ UIC tạo lớp giao diện người dùng Qt từ giao diện tùy chỉnh

Intention

class MyUiInterface { 
public: 
    virtual void setupUi(QWidget* w) = 0; 
    virtual void retranslateUi(QWidget*w) = 0; 
}; 

tạo tập tin UIC sẽ giống như thế:

class Ui_MyWidget { 
public: 
    void setupUi(QWidget* w) { 
     ... 
    } 
    void retranslateUi(QWidget* w) { 
     ... 
    } 
}; 

namespace Ui { 
    class MyWidget : public MyUiInterface , public Ui_MyWidget {}; 
} 

Tại sao?

Mọi Ui :: Lớp sau đó sẽ triển khai MyUiInterface. Trong mỗi lớp có nguồn gốc từ Ui :: Class (xem The Multiple Inheritance Approach) Tôi có thể gọi setupUiretranslateUi có ý nghĩa nếu lớp bắt nguồn từ UI :: Lớp lớp là lớp cơ bản. Tôi muốn mọi widget được bắt nguồn từ lớp cơ sở abstrcat của tôi MyWidgetBase. Xem xét sau đây:

class MyWidgetBase abstract : public QWidget, protected MyUiInterface { 
protected: 
    void changeEvent(QEvent *e) { 
     QWidget::changeEvent(e); 
     if (e->type() == QEvent::LanguageChange) { 
      retranslateUi(this); // Still abstract here 
     } 
    } 
}; 

class MyWidget : public MyWidgetBase : public Ui::MyWidget { 
}; 

Hiệu quả là, mỗi MyWidget thời gian :: changeEvent() được callled, retranslateUi đó lớp học cụ thể được gọi. Nếu không, changeEvent phải được thực hiện lại trong mỗi lớp. Điều này sẽ là một chút chống lại khái niệm "tái sử dụng mã".

Tôi nghĩ rằng Qt UIC không thể xử lý tình huống này phải không? Có cách nào tương tự để giải quyết vấn đề này không?

+0

+1 Câu hỏi hay! – cmannett85

Trả lời

0

Thật không may, đọc XML Schema for ui files cho chúng tôi biết rằng điều này không thể tự động hóa bằng trình biên dịch uic. Tuy nhiên, không rõ với tôi tại sao bạn muốn tự động thực hiện điều đó - ngay cả khi Uic quản lý bằng cách nào đó để thực hiện giao diện của bạn, bạn vẫn cần phải thêm các phần của các hàm bằng tay, chỉnh sửa tệp .h được tạo ra, như tôi chắc chắn rằng không có cách nào để bao gồm mã tùy chỉnh trong tệp xml sẽ dịch thành mã C++.

Tại sao bạn không thực hiện lại setupUiretranslateUi trong lớp học MyWidget của mình? Mỗi lớp Ui sẽ có một trong các lớp này, vì vậy bạn có thể thực hiện điều này ở cấp độ này, thay vì lớp cơ sở. Có thể là tôi đang thiếu một cái gì đó, nhưng tôi thấy đây là một cách thích hợp để làm điều này.

class MyWidget : public MyWidgetBase, public Ui::MyWidget { 
public: 
    void setupUi(QWidget* w) { 
     ... 
    } 
    void retranslateUi(QWidget* w) { 
     ... 
    } 

}; 

Với phương pháp này, bạn không cần phải reimplement changeEvent() trong bất kỳ widget tùy chỉnh của bạn, và changeEvent vẫn sẽ gọi cho phù hợp retranslateUi().

+0

Ok, tôi nghĩ ý của bạn là làm cho setupUi và retranslateUi thành các phương thức ảo trong lớp MyWidgetBase và thực hiện nó trong MyWidget (và tất cả những thứ khác có nguồn gốc từ MyWidgetBase) bằng cách gọi Ui :: MyWidget :: setupUi (this) ở đó. Điều này thực sự sẽ là một giải pháp. Với giải pháp của tôi, không cần phải chỉnh sửa các tệp tiêu đề đã tạo bằng cách _if_ trình biên dịch UI sẽ hoạt động như ý định của tôi :) – bkausbk

+0

@bkausbk Thật không may, trừ khi ai đó ở đây không biết bất kỳ hack nào để làm điều này, tôi không nghĩ nó có thể - nhưng chúng ta hãy xem, tôi thấy rất nhiều thứ làm việc afterall :) –

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