首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QTableWidget,Cellwidget,QLabel

QTableWidget,Cellwidget,QLabel
EN

Stack Overflow用户
提问于 2017-12-26 23:09:04
回答 1查看 1.5K关注 0票数 1

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

单击空单元格将正确的行和列写入控制台。单击标签被认为是一次单击,但是使用了错误的行和列(使用了以前的单元格数据)。

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

你好,谢谢你,迈克尔

代码语言:javascript
运行
复制
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;
    }

}

我试着把密码减少到最低限度。

代码语言:javascript
运行
复制
void MtTimeTable::slotLessonWidgetClicked()
 {        
    std::cerr << "Table Cell: [" << this->currentRow() << "," 
          << this->currentColumn() << "]" << std::endl;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-27 01:11:48

根据文档

int QTableWidget::currentColumn() const 返回当前项的列。 int QTableWidget::currentRow() const 返回当前项的行。

也就是说,它是项的位置,它引用一个QTableWidgetItem,但是如果我们使用setCellWidget没有创建一个项,那么这些位置就不合适了,我们必须寻找另一种方法来获取与小部件相关联的行和列。

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

代码语言:javascript
运行
复制
void MtTimeTable::slotLessonWidgetClicked(){
    auto lbl = qobject_cast<MtLessonWidget *>(sender());
    if(lbl){
       auto ix = indexAt(lbl->pos());
       qDebug()<<"Table Cell: [" <<ix.row()<< ","  <<ix.column()<< "]";
    }
}

完整的例子:

代码语言:javascript
运行
复制
#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();
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47984647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档