2014-10-10 31 views
0

的中心插件同步QTableWidget的細胞我使用QCheckBoxQTableWidgetCell與小區

QWidget *widget = new QWidget(); 
QCheckBox *checkBox = new QCheckBox(); 
QHBoxLayout *layout = new QHBoxLayout(widget); 
layout->addWidget(checkBox); 
layout->setAlignment(Qt::AlignCenter); 
layout->setContentsMargins(0, 0, 0, 0); 
widget->setLayout(layout); 
table->setCellWidget(0, 0, widget); 

此代碼的結果是在中心複選框的細胞。

我需要使複選框對鼠標移動作出反應,並在光標位於複選框下時在空白區域單擊。

+0

你能提供更多關於預期行爲的細節嗎? – 2014-10-10 12:01:11

回答

0

如果您不想要QCheckBox的完整功能,但只是選中標記,您可以使用簡單的QTableWidgetItem並修改其檢查狀態。

QTableWidgetItem* item = new QTableWidgetItem(); 
item->setCheckState(Qt::Unchecked); 
table->setItem (0, 0, item); 

connect(table, SIGNAL(cellClicked(int , int)), this, SLOT(OnClicked(int, int))); 


void OnClicked(int row, int column) 
{ 
    if(row != checkablelerow && col != checkablelecol) 
    return; // or do something else 

    item = table->item(row, column); 

    item->setCheckState(item->checkState() == Qt::Checked ? Qt::Unchecked : Qt::Checked); 
} 

現在整個單元格都會被檢查。代碼可能需要改進。

+0

我不明白什麼意思fullblown功能。我需要的是當光標在空白區域複選框突出顯示時,當lmb向下時複選框處於按下狀態。 – Ufx 2014-10-10 12:26:10

+0

我說fullblown的功能,因爲複選框是一個'QAbstractButton'(Qwidget) – UmNyobe 2014-10-10 12:44:19

0

當光標進入單元格時,您可以重寫eventFilter方法以突出顯示您的複選框。 http://qt-project.org/doc/qt-4.8/qobject.html#eventFilter

bool ExampleDialog::eventFilter(QObject *obj, QEvent *event) 
     { 
      if (qobject_cast<QTableWidgetItem*>(object)) { 
       if (event->type() == QEvent::HoverEnter) { 
        QCheckBox* qcb = object->findChild<QCheckBox*>(); 
        //here you can do something to highlight your checkbox 
        return true; 
       } 
       else if(event->type() == QEvent::HoverLeave){ 
        QCheckBox* qcb = object->findChild<QCheckBox*>(); 
        //here you have to stop highlighting checkbox 
         return true; 
       } 
       else { 
        return false; 
       } 
      } 
     } 

覆蓋後,您必須對您的小部件安裝事件過濾器這樣

widget->installEventFilter(this); //this points to parent of the widget, the exampleDialog 

而且使用QTableWidgetItem *的點擊插槽設置你的複選框選中。

void QTableWidgetItemClicked(int row, int column) 
{ 
    QCheckBox* qcb = QObject::sender()->findChild<QCheckBox*>(); 
    qcb->setChecked(!qcb->isChecked()); 
} 

請記住將QTableWidgetItems信號連接到插槽。

+0

'if(qobject_cast (object))' - error C2039:'qt_metacall':不是'QTableWidgetItem'的成員 – Ufx 2014-10-12 11:42:21

+0

我被替換到dynamic_cast。現在它編譯但不起作用。 – Ufx 2014-10-12 11:55:52