2014-04-17 24 views
5

Tôi đang sử dụng một QVariant để lưu trữ một con trỏ đến đối tượng của tôi trong một QComboBoxLàm cách nào để lấy lại dữ liệu từ QVariant cho một loại người dùng?

void MainFrame::initContainerBox(QComboBox *oBox) 
{ 
    IDataContainer *idc = new CSVContainer(); 
    QVariant v(QVariant::UserType, idc); 

    oBox->addItem(idc->getContainername(), v); 
    void *idc1 = v.data(); 
    if(idc1 == idc) 
     printf("Test\n"); 
} 

Nhưng làm thế nào để tôi nhận được dữ liệu trở lại? Khi tôi sử dụng data() con trỏ là khác nhau, do đó, điều này dường như không chính xác. Từ gooogling tôi đã có ấn tượng rằng tôi phải đăng ký một loại cho mỗi lớp tôi muốn sử dụng trong một QVariant là chính xác hoặc tôi có thể lấy giá trị mà không có điều đó?

+1

Sử dụng giá trị 'QVariant ::()' –

+0

Tôi cũng đang sử dụng 'giá trị', nhưng nó không hoạt động. Bạn có thể đưa ra một ví dụ làm việc? – Devolus

+0

@Devolus: hết tò mò, điều gì không hiệu quả? Bạn đã thử ví dụ này chưa (http://qt-project.org/doc/qt-5/qvariant.html#value)? – lpapp

Trả lời

6

Sau hai ngày googling và cố gắng tất cả các loại kết hợp cuối cùng tôi đã tìm ra cách để làm điều này. Dưới đây là ví dụ bằng cách sử dụng một mục QComboBox đặt một vật phẩm và đưa nó trở lại. IDataContainer * là một lớp tùy ý không liên quan đến Qt.

Q_DECLARE_METATYPE(IDataContainer *) 

void MainFrame::initContainerBox(QComboBox *oBox) 
{ 
    IDataContainer *idc = new CSVContainer(); 
    QVariant v; 
    v.setValue(idc); 

    oBox->addItem(idc->getContainername(), v); 
    QVariant v2 = oBox->itemData(oBox->currentIndex()); 

    IDataContainer *idc1 = v2.value<IDataContainer *>(); 
    if(idc1 == idc) 
     printf("Test\n"); 
} 

Vì vậy, với cách tiếp cận đầu tiên của tôi về sử dụng value() Tôi đã đi đúng hướng, các bit còn thiếu duy nhất là làm thế nào để thiết lập giá trị và sử dụng các macro Q_DECLARE_METATYPE(IDataContainer *).

Dường như việc sử dụng hàm tạo không hoạt động, vì vậy, bạn phải gọi số setValue(). Nếu ai đó biết làm thế nào để sử dụng constructor nó sẽ được tốt đẹp để hiển thị nó.

+1

Thử 'QVariant v (QVariant :: fromValue (idc));'. Mặc dù tôi không biết, nếu đó là đẹp hơn :) –

+0

Cảm ơn (+1) để chia sẻ câu trả lời. Tôi muốn nhiều hơn sẽ làm điều này. Điều đó thực sự đã giúp tôi. – Mawg

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