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()
方法,该方法返回与给定单元格相对于QTableWidget
的viewport()
的位置的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控件如何读取内容
如何使用 PyQt5 Python 将 QTableWidget 数据转换为 PDF