2012-04-07 45 views
10

Số điện thoại của tôi đã được nhập trước trong một QGraphicsScene ở cuối màn hình (hiển thị) - nhưng bật lên, do đó không thể xem được.Làm cách nào để làm cho cửa sổ bật lên QComboBox trở lên?

(Làm cách nào) có thể buộc cửa sổ bật lên mở ở trên tiện ích con?

tôi đã cố gắng tái triển khai showPopup như thế này:

void MyComboBox::showPopup() 
{ 
    QAbstractItemView *popupView = view(); 
    popupView->move(0,-100); 
    //popupView->window->move(0,-100); 
    QComboBox::showPopup(); 
} 

Kết quả là, rằng nội dung dường như được thay đổi, nhưng không phải là đối tượng cửa sổ bật lên phía dưới. Tôi nghĩ rằng có thể tìm ra giải pháp có kiểu như được nêu trong this article, nhưng tôi không thể tìm thấy bất kỳ kiểm soát Kiểu nào có thể hữu ích ở đây. Tôi khá mới với C++ cũng như Qt, vì vậy tôi có thể thiếu một cái gì đó hiển nhiên.

Tôi đánh giá cao mọi trợ giúp về vấn đề này!

Trân trọng,

Sebastian

Trả lời

13

Với những thông tin tìm thấy here, tôi đã có thể làm cho nó thực hiện theo cách này:

void SteuerQComboBox::showPopup() { 
    QComboBox::showPopup(); 
    QWidget *popup = this->findChild<QFrame*>(); 
    popup->move(popup->x(),popup->y()-this->height()-popup->height()); 
} 

Lưu ý rằng đó là hết sức quan trọng để gọi các lớp cơ sở " showPopup "đầu tiên.

Cảm ơn tất cả mọi người đã đọc câu hỏi của tôi và nghĩ về nó!

+0

Không một giải pháp tồi, nhưng nó hoạt hình xuống và sau đó di chuyển lên. – Len

0

giải pháp của user1319422 không phải là xấu, nhưng nó có hai vấn đề.

  1. Nếu nền tảng của bạn có hoạt ảnh GUI, hộp danh sách sẽ hoạt ảnh mở xuống dưới, sau đó được di chuyển phía trên hộp văn bản.
  2. Nếu bạn tắt hoạt ảnh combobox (hoặc bạn không có nó), cuộc gọi đến QComboBox :: showPopup() vẫn làm cho phần tử GUI bắt đầu xuất hiện trên màn hình. Vì vậy, di chuyển nó ở đó sẽ làm cho nó nhấp nháy như nó xuất hiện ở nơi đầu tiên và di chuyển đến tiếp theo.

Vì vậy, để giải quyết vấn đề đầu tiên, tôi chỉ tắt hoạt hình:

void MyComboBox::showPopup() 
{ 
    bool oldAnimationEffects = qApp->isEffectEnabled(Qt::UI_AnimateCombo); 
    qApp->setEffectEnabled(Qt::UI_AnimateCombo, false); 

    QComboBox::showPopup(); 
    qApp->setEffectEnabled(Qt::UI_AnimateCombo, oldAnimationEffects); 
} 

Sau đó, đối với vấn đề thứ hai, tôi chuyển khung trong trường hợp Show:

bool MyComboBox::eventFilter(QObject *o, QEvent *e) 
{ 
    bool handled = false; 
    if (e->type() == QEvent::Show) 
    { 
    if (o == view()) 
    { 
     QWidget *frame = findChild<QFrame*>(); 

     //For some reason, the frame's geometry is GLOBAL, not relative to the QComboBox! 
     frame->move(frame->x(), 
        mapToGlobal(lineEdit()->geometry().topLeft()).y() - frame->height()); 
    } 
    } 
    /*else if other filters here*/ 

    if (!handled) 
    handled = QComboBox::eventFilter(o, e); 

    return handled; 
} 
Các vấn đề liên quan