2017-01-02 82 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())); 
    } 
}