QTableWidget中实现双击某列item可以打开对话框

QTableWidget中实现双击某列item可以打开对话框

我在实现这个功能时,绕了很大弯路,希望可以帮助后来人。

首先,区别QTableWidget中的两个概念,单元格和item。
单元格,就是表格中的一个格子。
item,是一个实实在在已经建立的对象。
区别:单元格只是一个格子,是被画出来的格子。item是真正占有内存的,包含数据和函数。

数据格式

struct LotteryCandidateInformation
	{
		QString strName;
		QString strFilePath;
	};

QTableWidget设置

	m_ptableCandidate->setColumnCount(2);
	m_ptableCandidate->setRowCount(m_nCandidateNumber);

	m_ptableCandidate->setHorizontalHeaderLabels(QStringList() << "姓名" << "文件路径");
	m_ptableCandidate->verticalHeader()->setVisible(false); // 隐藏水平header
	m_ptableCandidate->setSelectionBehavior(QAbstractItemView::SelectItems);   // 单个选中
	m_ptableCandidate->setSelectionMode(QAbstractItemView::ExtendedSelection);  // 可以选中多个
	m_ptableCandidate->setEditTriggers(QAbstractItemView::SelectedClicked);
	m_ptableCandidate->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);	// 路径一列设置为自动拉伸

列表初始化

	m_nCandidateNumber = 3;
	LotteryCandidateInformation* m1 = new LotteryCandidateInformation;
	m1->strName = "00";
	m1->strFilePath = "01";
	LotteryCandidateInformation* m2 = new LotteryCandidateInformation;
	m2->strName = "10";
	m2->strFilePath = "11";
	LotteryCandidateInformation* m3 = new LotteryCandidateInformation;
	m3->strName = "20";
	m3->strFilePath = "21";
	m_listCandidate.push_back(m3);
	m_listCandidate.push_back(m2);
	m_listCandidate.push_back(m1);
	// 加载候选人名单
	for(int i=0; i< m_nCandidateNumber; ++i)
	{
		QTableWidgetItem* item1 = new QTableWidgetItem(m_listCandidate.at(i)->strName);
		QTableWidgetItem* item2 = new QTableWidgetItem(m_listCandidate.at(i)->strFilePath);
		m_ptableCandidate->setItem(i, 0, item1);
		m_ptableCandidate->setItem(i, 1, item2);		
	}

槽函数及连接

connect(m_ptableCandidate, SIGNAL(cellDoubleClicked(int , int )), this, SLOT(slot_doubleClicked(int , int )));
//connect(m_ptableCandidate, SIGNAL(itemDoubleClicked(QTableWidgetItem*)), this, SLOT(slot_doubleClicked(QTableWidgetItem*)));

void LotteryCandidateWidget::slot_doubleClicked(int row, int column)
{
	if (column == FILE_PATH_COLUMN)
	{
		QString fileName = QFileDialog::getOpenFileName(this, "选择文件", ".");	// , tr("html (*.html, *.htm)"));
		if(fileName != NULL)
			m_ptableCandidate->item(row, column)->setText(fileName);
			//m_listCandidate[item->row()]->strFilePath = fileName;		///< 修改对应路径
	}
}

其他的声明就自己去写吧。有不清楚的再评论中问就好了。
上面两个信号再这种情况下,都是可以的。但是当没有new的对象时,则只能用cellDoubleClicked(int,int)这一种。这一种不需要创建item。

下面说一下我遇到的问题。
在不添加new出来的item时,itemDoubleClicked(QTableWidgetItem*)这个信号是不会被触发的。原本的显示出来三行两列的表格,双击是可以修改的,我通过设置EditTriggers,屏蔽掉了双击修改的方式,只留下了一种。那时候就以为既然可以双击修改,就应该由双击这个信号,很难受的是,我先找上的itemDoubleClicked,结果弄了好久,都不行。后来发现还有另外一个,而且是可以用的,就想到了他们的区别。想来,后者应该是由item发出的信号,前者是widget本身发出的信号。这样就可以解释为什么没有new出item时,不会得到itemDoubleClicked的信号了。

你可能感兴趣的:(qt,qt,QTableWidget,双击,对话框)