QTableWidget、Cellwidget、QLabel

Posted

技术标签:

【中文标题】QTableWidget、Cellwidget、QLabel【英文标题】:QTableWidget, Cellwidget, QLabel 【发布时间】:2017-12-26 23:09:04 【问题描述】:

我创建了一个 QTableWidget。一些单元格填充有单元格小部件(修改后的 QLabel,发送点击信号)。 现在,我想对单击此标签做出反应。我添加了一些调试功能。

单击空单元格会将正确的行和列写入控制台。 点击标签被识别为点击,但行和列错误(使用了之前的单元格数据)。

问题:如何获得正确的行和列以点击标签。

问候和感谢,迈克尔

MtTimeTable::MtTimeTable( QWidget* parent )
    : QTableWidget  parent , mIdArray  MtIdArray() ,
      mDate  QDate::currentDate() 

    this->fillLesssonWidgets();

    connect( this, &MtTimeTable::cellClicked,
             this, &MtTimeTable::slotCellActivated );


void MtTimeTable::fillLessonWidgets()

    MtLessonVec lessonVec  true ; // Data to show, loaded from file

    auto cit  lessonVec.begin() ;
    while( cit != lessonVec.end() ) 
        // Class MtLessonWidget derived from QLabel
        MtLessonWidget* lessonWidget  new MtLessonWidget ;
        lessonWidget->setLesson( *cit );
        // Using member functions of MtLessonwidget, working correct
        this->setCellWidget( lessonWidget->startingRow(), 
                             lessonWidget->startingCol(), 
                             lessonWidget );

        

        connect( lessonWidget, &MtLessonWidget::sigClicked,
                 this, &MtTimeTable::slotLessonWidgetClicked );

        ++cit;
    


我已尝试将代码减少到最少。

void MtTimeTable::slotLessonWidgetClicked()
         
    std::cerr << "Table Cell: [" << this->currentRow() << "," 
          << this->currentColumn() << "]" << std::endl;

【问题讨论】:

也许你的错误出现在修改后的单元格小部件中。 它只是一个从 QLabel 派生的简单类,只为鼠标按下事件添加了一个受保护的函数。信号发出正确。 带有小部件的 QTableWidget 单元格不会对鼠标单击做出反应。 您可以显示您的代码以查看问题所在。 你可以展示 slotLessonWidgetClicked 的实现。 :P 【参考方案1】:

根据docs:

int QTableWidget::currentColumn() const

返回当前项目的列。

int QTableWidget::currentRow() const

返回当前项所在的行。

即是item的位置,它是指一个QTableWidgetItem,但是如果我们使用setCellWidget一个item并没有被创建,所以那些位置不合适,我们必须寻找另一种方法来获取row和与小部件关联的列。

一种方法是使用indexAt() 方法,该方法返回与给定单元格相对于QTableWidgetviewport() 的位置的QModelIndex,这是应该使用的:

void MtTimeTable::slotLessonWidgetClicked()
    auto lbl = qobject_cast<MtLessonWidget *>(sender());
    if(lbl)
       auto ix = indexAt(lbl->pos());
       qDebug()<<"Table Cell: [" <<ix.row()<< ","  <<ix.column()<< "]";
    

完整示例:

#include <QApplication>
#include <QLabel>
#include <QTableWidget>
#include <QDebug>

class CustomLabel: public QLabel
    Q_OBJECT
protected:
    void mousePressEvent(QMouseEvent *)
        emit clicked();
    
signals:
    void clicked();
;

class TableWidget: public QTableWidget
    Q_OBJECT
public:
    TableWidget(QWidget* parent=Q_NULLPTR):QTableWidget(parent)
        setRowCount(10);
        setColumnCount(10);
        for(int i=0; i<rowCount(); i++)
            for(int j=0; j<columnCount(); j++)
                auto lbl = new CustomLabel;
                setCellWidget(i, j, lbl);
                connect(lbl, &CustomLabel::clicked, this, &TableWidget::onClicked);
            
        
    
private slots:
    void onClicked()
        auto lbl = qobject_cast<CustomLabel *>(sender());
        if(lbl)
           auto ix = indexAt(lbl->pos());
           qDebug()<<"Table Cell: [" <<ix.row()<< ","  <<ix.column()<< "]";
        
    
;

#include "main.moc"

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    TableWidget w;
    w.show();

    return a.exec();

在下面的链接中,我展示了完整的example。

【讨论】:

以上是关于QTableWidget、Cellwidget、QLabel的主要内容,如果未能解决你的问题,请参考以下文章

qtablewidget加入QcomboBox控件如何读取内容

在 QTableWidget 的中心对齐单元格小部件?

如何使用 PyQt5 Python 将 QTableWidget 数据转换为 PDF

使用 PyQt/PySide 禁用 QTableWidget 中特定列中的排序箭头

7.7.2 tableWidget相关函数介绍

显示多个项目的总和