2012-10-09 39 views
2

我必須在QTableView中繪製自定義控件。這個控件必須看起來像FileChooser。上述如何在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 - 看起來像QButton, - 但沒有將QStyle :: CE_LineEdit在Qt庫。我如何繪製QLineEdit?

回答

1

爲了繪製自定義部件在表視圖,您需要創建一個自定義的QItemDelegate子類並覆蓋至少createEditor方法,在那裏你可以創建任何類型的小部件被顯示時,雙擊進入單元格。這個項目委託可以被分配到你的表格視圖中的相應列。

然後,您需要創建一個單獨的類,例如CustomFileChooser從QWidget繼承,由Line Edit和Button組成。

您的createEditor方法會返回這樣的對象。

您可能還必須重寫setEditorData(它應將當前模型值分配給創建的編輯器窗口小部件)和setModelData(當提交更改時調用該窗口)。

這樣,行編輯和按鈕只有在雙擊表格單元格後纔可見。如果你希望它始終可見,你也必須重寫drawDisplay()。

+0

控制應始終可見。需要解決上述問題(將QLineEdit繪製爲QStyle :: ControlElement)以覆蓋drawDisplay(和drawFocus),不是嗎? 但我選擇另一種方式。我的委託從QStyledItemDelegate繼承,我嘗試重寫paint和editorEvent方法。 [複選框控件示例](http://stackoverflow.com/questions/3363190/qt-qtableview-how-to-have-a-checkbox-only-column)。 – meldo

0

我自己找到了答案。您可以顯示永久使用自定義編輯器(普通部件):

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

首先你要明白,一個按鈕控制元件,因此你可以在CE找到它,但是當你需要一個lineEdit它不是一個控制元素。 爲了畫一個lineEdit,我應該從Qt文檔引用,

「QStyleOptionFrameV2繼承QStyleOptionFrame這是用於繪製幾個內置的Qt控件,包括QFrame,QGroupBox,QLineEdit的,和QMenu。」

是的,只有可能工作的示例代碼將幫助您清楚地理解它! 該代碼應該不知何故看起來像這樣

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 .... –

相關問題