2013-09-06 34 views
8

Tôi mới dùng C++ và Qt và tôi đang cố gắng truy cập một tiện ích con từ một lớp cha.C++ truy cập các tiện ích con từ một hàm

Đây là mainwindow.cpp tôi

MainWindow::MainWindow(QWidget *parent) 
    : QMainWindow(parent) 
    , ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

Tôi có một lớp khác, và tôi đang cố gắng để truy cập vào một widget từ "ui" trong lớp đó. Giống như vậy:

DashBoard::DashBoard(MainWindow *parent) : QObject(parent) 
{ 
} 

void DashBoard::select() 
{ 
    parent->ui->menuSL->setCurrentIndex(0); 
} 

Điều này cho tôi lỗi khi nói rằng các phương pháp và trường không thể giải quyết được. Nhưng khi tôi đặt dòng parent->ui->menuSL->setCurrentIndex(0); trong hàm tạo, không có vấn đề gì.

Có ai vui lòng chỉ ra sai lầm của tôi không?

+2

Bạn nên phát ra tín hiệu trong chức năng 'DashBoard :: select()' và kết nối nó với khe 'setCurrentIndex (int)' của đối tượng 'menSL' của đối tượng', hoặc vào một hàm trong lớp 'MainWindow' của bạn. – thuga

+0

Tôi đồng ý với thuga. Phát ra tín hiệu từ DashBoard là một cách tiếp cận tốt hơn. – drescherjm

+1

Tôi sẽ không khuyên bạn truy cập trực tiếp vào 'ui' của cha mẹ bạn. Thay vào đó, lấy được cha mẹ của bạn từ một giao diện với các phương thức truy cập xác định có thể được gọi từ con bạn. Ví dụ: dynamic_cast (parent()) -> SetMenu (0); Hoặc sử dụng khái niệm tín hiệu/khe. – bkausbk

Trả lời

2

Trong phương pháp chọn của bạn, bạn cố gắng sử dụng biến có tên parent. Nhưng bạn cần phương thức QObject::parent().

Ngoài ra, bạn cần truyền cha mẹ đến QMainWindow.

void DashBoard::select() { 
    QMainWindow* parent = qobject_cast<QMainWindow>(this->parent()); 
    if (parent == 0) { return; } // or some other error handling 
    parent->ui->menuSL->setCurrentIndex(0); 
} 

Bạn chỉ có thể truy cập ui nếu công khai.

Tóm lại, tôi nghĩ bạn nên cung cấp phương thức trong bạn MainWindow lớp thực hiện thao tác bạn muốn.

+0

Tôi không biết, không truyền trở lại của parent() sang bên phải loại lớp đánh bại mục đích của giống như không ghi đè cha mẹ() để bắt đầu với? – n611x007

3

Từ mã, người ta có thể suy ra rằng lớp DashBoard kế thừa QObject. Trường parent của QObject được định nghĩa là con trỏ đến QObject vì vậy khi bạn gọi parent->ui->menuSL->setCurrentIndex(0); bên trong phương thức của lớp DashBoard, bạn giả định rằng QObject xác định thành viên được gọi là ui không đúng.

Chỉ cần đúc cha mẹ theo cách này:

((MainWindow*)(parent()))->ui->menuSL->setCurrentIndex(0); 

hay này:

MainWindow* parent = qobject_cast<MainWindow*>(this->parent()); 
// check parent is not null 
parent->ui->menuSL->setCurrentIndex(0); 

Trong constructor bạn không thấy lỗi vì parent được định nghĩa là một con trỏ đến một đối tượng của lớp MainWindow và sau đó được chuyển đến hàm tạo của QObject.

Đừng quên đặt ui công khai và bao gồm tiêu đề giao diện người dùng được tạo tự động nếu sử dụng Nhà thiết kế Qt (trong trường hợp của bạn có thể là "ui_mainwindow.h") trong tệp cpp DashBoard.

LƯU Ý: Tôi chỉ đang cố trả lời câu hỏi của bạn nhưng tôi khuyến khích bạn xem lại cách bạn đang thực hiện việc này. Có một số cách để đạt được điều tương tự với thiết kế OO nhất quán hơn.

+0

sản xuất lỗi này : sử dụng không hợp lệ chức năng thành viên (bạn đã quên '()'?) – user2444217

+1

Đặt 'ui' công khai và bao gồm' #include "ui_mainwindow.h" 'trong DashBoard cpp. – mhcuervo

+2

'((MainWindow *) (parent())) -> ...' thực sự hoạt động, cảm ơn. – TranslucentCloud

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