2016-12-01 9 views
1

나는 두통이 심하다.
다음을 고려해 보겠습니다. QStyledItemDelegate에서 파생 된 사용자 지정 대리자가있는 QListView가 있습니다.
위임자의 paint() 이벤트에서 나는 tableview에서 내가 render() 인 사용자 정의 위젯을 사용합니다. 단지 statick 렌더링이고 상호 작용없이 무언가를 보여줄 필요가 있기 때문에 괜찮습니다.
내 맞춤 위젯에는 세로 레이아웃에 포함 된 QTableWidget과 대리인의 sizehint()에 데이터로 채울 수있는 다른 레이블이 포함되어 있습니다. 그런 다음이 기술로 사용자 정의 위젯의 레이아웃을 강제 업데이트합니다 : Qt: How to force a hidden widget to calculate its layout? - forceUpdate() 코드를 참조하십시오.
한 가지를 제외한 모든 것이 정말 멋지게 보입니다. 내 맞춤 위젯의 tablewidget이 필요할 때 (내가 행을 추가 할 때) 세로로 커지는 것처럼 보이지만 행이 렌더링되지 않습니다 !!! 수축은 괜찮지 만, 커스텀 위젯의 매우 큰 높이를 어떻게 든 설정하면 문제는 해결되지만 우아하지 않고 단지 문제를보고합니다.
방금 ​​렌더링되었으므로 대화 형이 아니기 때문에 스크롤바가 필요 없지만 QTableWidget을 축소/확대하여 추가 된 데이터를 표시해야합니다. 그 이상도 이하도 아닌.
사용자 정의 위젯의 GUI는 디자이너와 함께 이루어지며 모든 것이 동적으로 확장되고 축소되도록 설정됩니다. 캐치 어딨어? 그런 행동을 본 사람이 있습니까? 그렇다면 마법 매개 변수 조합은 무엇입니까? 눈을

일부 코드 : 어떤 도움을 크게 감상 할 수
Qt : 델리게이트 페인트 이벤트에서 렌더링 할 때 QTablewidget을 늘리는 방법?

QSize ResultsRunDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { 
    // updating custom widget's data 
    item_widget->UpdateDisplay(index.row()+1); 
    forceUpdate(item_widget); //updating the layout 
    return item_widget->sizeHint(); } 

void ResultsRunDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 

    QPaintDevice* originalPaintDev = painter->device(); 
    if (option.state & QStyle::State_Selected) 
     painter->fillRect(option.rect, option.palette.highlight()); 

    painter->end(); 


    forceUpdate(item_widget); 
    item_widget->render(painter->device(), QPoint(option.rect.x(), option.rect.y()), QRegion(0, 0, item_widget->rect().width()/*item_widget->sizeHint().width()*/, /*item_widget->rect().height()*/item_widget->sizeHint().height()), QWidget::DrawChildren); 

    painter->begin(originalPaintDev); 
} 

. 미리 Thx! 질문 제목이 좋기를 바랍니다. 환영합니다.

답변

1

sizeHint()QTableView은 안타깝게도 그 내용에 의존하지 않습니다. 레이아웃이 계산 된 후 테이블의 이상적인 크기를

int width = view->verticalHeader()->width() + view->horizontalHeader()->width() + view->frameWidth()*2; 
int height= view->horizontalHeader()->height() + view->verticalHeader()->height() + view->frameWidth()*2; 

에서 얻을 수 있으며 그에 따라 위젯의 크기를 조정할 수 있습니다.

+0

정답은 아니지만 거의! hlBottom = 반역적인 QTableWidget을 포함하는 가로 레이아웃을 가진'tableWidget-> resize (m_ui-> hlBottom-> sizeHint(), width(), m_ui-> hlBottom-> sizeHint(). 당신 덕분에 내 문제에 대한 올바른 해결책을 찾았습니다! 내'forceUpdate()'호출 후에 그것을한다. 고마워요 !!! 어쩌면 당신은 당신의 대답을 편집 할 수 있고 그것을 해결책 등으로 표시 할 것입니다;) – RDK