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 setupUi
và retranslateUi
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?
+1 Câu hỏi hay! – cmannett85