如何在QTableView中绘制自定义控件?

时间:2012-10-09 09:44:42

标签: c++ qt

我必须在QTableView中绘制一个自定义控件。此控件必须类似于FileChooser。

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, - 但Qt库中没有QStyle :: CE_LineEdit。我该如何绘制QLineEdit?

3 个答案:

答案 0 :(得分:1)

为了在表视图中绘制自定义小部件,您需要创建一个自定义QItemDelegate子类并至少覆盖createEditor方法,您可以在其中创建任何类型的小部件,双击表格单元格。可以将此项目委托分配给表视图中的相应列。

然后您需要创建一个单独的类,例如CustomFileChooser,它继承自QWidget,由行编辑和按钮组成。

然后,您的createEditor方法将返回此类对象。

您可能还必须覆盖setEditorData(它将当前模型值分配给已创建的编辑器窗口小部件)和setModelData(在提交更改时调用)。

这样,只有在双击表格单元格后才能看到行编辑和按钮。如果您希望它始终可见,您还必须覆盖drawDisplay()。

答案 1 :(得分:1)

我自己找到了答案。您可以使用以下方式永久显示自定义编辑器(普通窗口小部件):

void QAbstractItemView::openPersistentEditor ( const QModelIndex & index )

答案 2 :(得分: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);