2017-01-02 148 views
0

我有一个自定义Delegate,从QItemDelegate分类,它提供了第一列中的QComboBox和所有其他列中的QLineEdit。QItemDelegate编辑器的大小

SensorDisplayDelegate::SensorDisplayDelegate(QObject *parent) : 
    QItemDelegate(parent) 
{} 

QWidget *SensorDisplayDelegate::createEditor(QWidget *parent, 
              const QStyleOptionViewItem &option, 
              const QModelIndex &index) const 
{ 
    int col = index.column(); 
    if(col == 0) 
    { 
     QComboBox *comboBox = new QComboBox(parent); 
     connect(comboBox, SIGNAL(activated(int)), this, SLOT(setData(int))); 
     comboBox->setEditable(false); 
     //comboBox->setMaximumSize(editorSize); 
     comboBox->setInsertPolicy(QComboBox::NoInsert); 
     currentComboBox = comboBox; 
     return comboBox; 
    } 
    else  
    { 
     QLineEdit *lineEdit = new QLineEdit(parent); 
     return lineEdit; 
    } 

    return NULL; 
} 

void SensorDisplayDelegate::setEditorData(QWidget *editor, 
              const QModelIndex &index) const 
{ 
    int col = index.column(); 
    if(col == 0) 
    { 
     QComboBox *comboBox = static_cast<QComboBox*>(editor); 
     QStringList comboItems = index.data(Qt::EditRole).toStringList(); 

     comboBox->addItem("Add New Sensor"); 
     comboBox->addItems(comboItems); 

     QCompleter *completer = new QCompleter(comboItems); 
     completer->setCaseSensitivity(Qt::CaseInsensitive); 
     comboBox->setCompleter(completer); 
     comboBox->showPopup(); 
    } 
    else 
    { 
     QLineEdit *lineEdit = static_cast<QLineEdit*>(editor); 
     lineEdit->setText(index.data(Qt::EditRole).toString()); 
     lineEdit->show(); 
    } 
} 

void SensorDisplayDelegate::setModelData(QWidget *editor, 
             QAbstractItemModel *model, 
             const QModelIndex &index) const 
{ 
    int col = index.column(); 
    if(col == 0) 
    { 
     QComboBox *comboBox = static_cast<QComboBox*>(editor); 
     if(comboBox->currentIndex() == 0) 
      emit addNewSensor(); 
     else 
      emit populateSensorView(comboBox->currentText()); 
    } 
    else 
    { 
     QLineEdit *lineEdit = static_cast<QLineEdit*>(editor); 
     model->setData(index, QVariant(lineEdit->text())); 
    } 

} 

void SensorDisplayDelegate::updateEditorGeometry(QWidget *editor, 
    const QStyleOptionViewItem &option, const QModelIndex &/* index */) const 
{ 
    editor->setGeometry(option.rect); 
} 

QSize SensorDisplayDelegate::sizeHint(const QStyleOptionViewItem &option, 
             const QModelIndex &index) const 
{ 
    return editorSize; 
} 


void SensorDisplayDelegate::setData(int option) 
{ 
    emit commitData(currentComboBox); 
    emit closeEditor(currentComboBox); 
} 

editTrigger已设置为selectClicked。我希望组合框覆盖QTableView中的整个单元格。但是,现在它只是在左上角显示为blip。我尝试通过在QTableView上侦听mousePressed的事件过滤器传递单元大小来设置最小大小。但是,委托中的相应槽不会被调用。下面的代码:

MultiEventFilter.cpp:

bool MultiEventFilter::eventFilter(QObject *obj, QEvent *event) 
{ 
    if(event->type() == QEvent::MouseButtonPress) 
    { 
     if(obj->objectName() == "sensorlocationTableView") 
     { 
      QTableView *sensorView = static_cast<QTableView*>(obj); 
      QModelIndexList idxs = sensorView->selectionModel()->selectedIndexes(); 
      if(!idxs.empty()) 
      { 
       QModelIndex idx = idxs.at(0); 
       emit passCellSize(QSize(sensorView->columnWidth(idx.column()), 
             sensorView->rowHeight(idx.row()))); 
      } 
     } 
    } 

    return false; 
} 

安装qApp。

MainWindow.cpp:

eFilter = new MultiEventFilter(); 
    connect(eFilter, SIGNAL(passCellSize(QSize)), 
      sensor_display_delegate, SLOT(setEditorSize(QSize))); 

SensorDisplayDelegate.cpp槽:

void SensorDisplayDelegate::setEditorSize(const QSize &size) 
{ 
    editorSize = size; 
} 

其中QSIZE editorSize是一个私有成员。 如何正确设置编辑器的大小?我需要一些可以应用于QLineEdit编辑器的常规应用。 另外,编辑器关闭时是否需要显式地发出commitData()?在涉及QComboBox的任何示例代码中,我没有看到这一点。

回答

0

我怀疑你的eventFilter在选择索引设置之前拦截了点击事件。那么,你总是碰到一个空的idxs IndexList?

尝试的东西,如更换该循环:

bool MultiEventFilter::eventFilter(QObject *obj, QEvent *event) 
{ 
    if(event->type() == QEvent::MouseButtonPress) 
    { 
     if(obj->objectName() == "sensorlocationTableView") 
     { 
      emit locationTableViewClicked(); 
     } 
    } 

    return false; 
} 

.... 

connect(eFilter, SIGNAL(locationTableViewClicked()), 
     sensor_display_delegate, SLOT(setEditorSize())); 
... 

void SensorDisplayDelegate::setEditorSize() 
{ 
    QModelIndexList idxs = sensorView->selectionModel()->selectedIndexes(); 
    if(!idxs.empty()) 
    { 
     QModelIndex idx = idxs.at(0); 
     editorSize = QSize(sensorView->columnWidth(idx.column()), 
          sensorView->rowHeight(idx.row())); 
    } 
}