2012-10-09 3 views
2

QTableView에서 사용자 지정 컨트롤을 그려야합니다. 이 컨트롤은 FileChooser와 비슷해야합니다. , QButton처럼 보이는 - -QTableView에서 사용자 정의 컨트롤을 그리는 방법은 무엇입니까?

FileChooser http://www.vision.ee.ethz.ch/computing/sepp-irix/qt-3.0-mo/filechooser.png

QStyleOptionButton button_option; 
button_option.state |= QStyle::State_Enabled | QStyle::State_Off; 
button_option.rect = PushButtonRect(option); //calculate button rect 
button_option.text = "..."; 
QApplication::style()->drawControl(
    QStyle::CE_PushButton, 
    &button_option, 
    painter); 

위의 코드는 QStyle :: CE_PushButton립니다하지만 Qt는 라이브러리에는 QStyle :: CE_LineEdit가 없습니다. QLineEdit은 어떻게 그릴 수 있습니까?

답변

1

테이블 뷰에 사용자 정의 위젯을 그리려면 사용자 정의 QItemDelegate 서브 클래스를 작성하고 적어도 createEditor 메소드를 대체해야합니다. 여기서 테이블 셀을 두 번 클릭 할 때 표시되는 모든 종류의 위젯을 작성할 수 있습니다 . 이 항목 대리자는 테이블보기의 각 열에 할당 할 수 있습니다.

그런 다음 별도의 클래스를 만들어야합니다. 예 : QWidget에서 상속 받고 Line Edit와 Button으로 구성된 CustomFileChooser.

그러면 createEditor 메소드가 그러한 객체를 반환합니다.

setEditorData (작성된 편집기 위젯에 현재 모델 값을 지정 함) 및 setModelData (변경 사항이 커밋 될 때 호출 됨)를 대체해야 할 수도 있습니다.

이렇게하면 행 편집 및 단추는 표 셀을 두 번 클릭 한 후에 만 ​​표시됩니다. 항상 표시되도록하려면 drawDisplay()도 재정의해야합니다.

+0

컨트롤이 항상 표시되어야합니다. drawDisplay (및 drawFocus)를 재정의하려면 위에서 설명한 문제를 해결해야합니다 (QLineEdit를 QStyle :: ControlElement로 그립니다). 그렇지 않습니까? 하지만 다른 방법을 선택합니다. QStyledItemDelegate에서 상속 된 대리자로 paint 및 editorEvent 메서드를 재정의하려고합니다. [체크 박스 제어 예제] (http://stackoverflow.com/questions/3363190/qt-qtableview-how-to-have-a-checkbox-only-column). – meldo

0

혼자서 대답을 찾았습니다. 당신이 버튼 컨트롤이 요소임을 이해할 필요가있어 당신이 CE에서 찾을 수 있지만, 당신은 lineEdit을 필요로 할 때 그것이 아니다

void QAbstractItemView::openPersistentEditor (const QModelIndex & index) 
1

첫째, 당신은 영구적으로 사용하여 사용자 정의 편집기 (일반 위젯)을 표시 할 수 있습니다 제어 요소. lineEdit 페인트하기 위해 , 나는

는 Qt는 문서에서 인용된다 "QStyleOptionFrameV2 그리기에 사용되는 QStyleOptionFrame을 상속 여러 내장 QFrame, QGroupBox, QLineEdit 및 QMenu를 포함 Qt는 위젯,."

예, 작동하는 샘플 코드 만 명확하게 이해하는 데 도움이됩니다. 코드는 어떻게 든 유사해야합니다.

QStyleOptionFrameV2 *panelFrame = new QStyleOptionFrameV2; 
QLineEdit *search = new QLineEdit; 
panelFrame->initFrom(search); 
panelFrame->rect = QRect(x,y,w,h);//Indeed the location and the size 
panelFrame->lineWidth = QApplication::style->pixelMetric(QStyle::PM_DefaultFrameWidth, panelFrame, search); 
panelFrame->state |= QStyle::State_Sunken; 
QApplication::style()->drawPrimitive(QStyle::PE_PanelLineEdit, panelFrame, painter); 
+0

그래서 사용자 정의 컨트롤이 아니므로 drawControl을 사용하여 그려지지 않았습니다 ...이 질문의 주제는 drawPrimitive ...로 변경되어야합니다. –

관련 문제