Qt TableWidget翻页功能 点击item项加载图片

本文介绍如何在Qt的TableWidget中实现点击item加载图片功能,结合翻页按钮,展示从QVector存储的路径中读取的图片。通过添加序号列和控制底部按钮组,实现页面切换和高亮效果。详细步骤包括设置点击响应、添加表格项、处理删除操作以及图片显示逻辑。

思路:把路径保存在QVector中,给TableWidget添加添加序号列,点击item,读取当前选择的页面数,去QVector中获取路径,加载图片显示在图片控件中。

表格底下的4个按钮页放在group中,联动实现只能选中一个高亮。

.h

public:
void appendTableItem(int index, const char * name,int nserial);
	
void clearTableItems(int index);

private:
QVector <QString> m_exInfo;
QVector <QString> m_listpicvideo;
QVector <QString> m_listattachment;

int m_nListTopPage;
int m_nListBottomPage;

int m_nTopSelectedPage;
int m_nBottomSelectedPage;

public slots:
void show_img_list1(int row,int col);
void show_img_list2(int row, int col);
void OnBtnTableDeleteClicked1();
void OnBtnTableDeleteClicked2();

.cpp

popDataLabel::popDataLabel()
{
    m_nListTopPage = 0;
	m_nListBottomPage = 0;

	m_nTopSelectedPage = 1;
	m_nBottomSelectedPage = 1;
}

点击上一页按钮,响应clicked

if (index == eScbtn_previouspage_list1)
	{
		if (m_nTopSelectedPage != 1)
		{
			m_nTopSelectedPage = m_nTopSelectedPage - 1;

			int nSelectedTopPage = BtnGroupB->checkedId();
			if ((m_nListTopPage > 4) && (nSelectedTopPage == 0))
			{
				QString strBtn1Num = QString::number(m_nTopSelectedPage);
				QString strBtn2Num = QString::number(m_nTopSelectedPage + 1);
				QString strBtn3Num = QString::number(m_nTopSelectedPage + 2);
				QString strBtn4Num = QString::number(m_nTopSelectedPage + 3);

				QByteArray charBtn1 = strBtn1Num.toLatin1();
				QByteArray charBtn2 = strBtn2Num.toLatin1();
				QByteArray charBtn3 = strBtn3Num.toLatin1();
				QByteArray charBtn4 = strBtn4Num.toLatin1();

				const char* cBtn1Num = charBtn1.data();
				const char* cBtn2Num = charBtn2.data();
				const char* cBtn3Num = charBtn3.data();
				const char* cBtn4Num = charBtn4.data();

				setBottomBtnNum(eRkbtn_biaoqian_picvideo_list1, cBtn1Num, cBtn2Num, cBtn3Num, cBtn4Num);
			}
			else
			{
				QAbstractButton * checkBtn = BtnGroupB->button(nSelectedTopPage - 1);
				checkBtn->setChecked(true);
			}
			updatePicUI();
		}

点击page页数按钮

if (index == eScbtn_page1_list1)
	{
		m_nTopSelectedPage = ((QPushButton*)m_btnsIndex[eScbtn_page1_list1])->text().toInt();
		updatePicUI();
	}
	else if (index == eScbtn_page2_list1)
	{
		m_nTopSelectedPage = ((QPushButton*)m_btnsIndex[eScbtn_page2_list1])->text().toInt();
		updatePicUI();
	}

点击下一页,响应nextpage

if (index == eScbtn_nextpage_list1)
	{
		if (m_nTopSelectedPage != m_nListTopPage)
		{
			m_nTopSelectedPage = m_nTopSelectedPage + 1;
			
			int nSelectedTopPage = BtnGroupB->checkedId();
			if ((m_nListTopPage > 4) && (nSelectedTopPage == 3))
			{
				QString strBtn1Num = QString::number(m_nTopSelectedPage);
				QString strBtn2Num = QString::number(m_nTopSelectedPage - 1);
				QString strBtn3Num = QString::number(m_nTopSelectedPage - 2);
				QString strBtn4Num = QString::number(m_nTopSelectedPage - 3);

				QByteArray charBtn1 = strBtn1Num.toLatin1();
				QByteArray charBtn2 = strBtn2Num.toLatin1();
				QByteArray charBtn3 = strBtn3Num.toLatin1();
				QByteArray charBtn4 = strBtn4Num.toLatin1();

				const char* cBtn1Num = charBtn1.data();
				const char* cBtn2Num = charBtn2.data();
				const char* cBtn3Num = charBtn3.data();
				const char* cBtn4Num = charBtn4.data();

				setBottomBtnNum(eRkbtn_biaoqian_picvideo_list1, cBtn4Num, cBtn3Num, cBtn2Num, cBtn1Num);
			}
			else
			{
				QAbstractButton * checkBtn = BtnGroupB->button(nSelectedTopPage + 1);
				checkBtn->setChecked(true);
			}
			updatePicUI();
		}
	}

添加TableBox代码:

QTableWidget* popDataLabel::addTableBox(int index, int x, int y, int w, int h, int limit, std::vector<const char*> heads)
{
	QTableWidget* table = new QTableWidget(this);
	table->setObjectName(get_ObjectName(index));
//	table->m_handle = this;
	table->move(x, y);
	table->resize(w, h);
	m_btns[table] = index;
	m_btnsIndex[index] = table;

	table->setShowGrid(false);//设置显示格子线 
	table->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式 
	table->setSelectionMode(QAbstractItemView::SingleSelection);//单行选中
	table->setEditTriggers(QAbstractItemView::NoEditTriggers);	//设置不可编辑
	table->setFocusPolicy(Qt::NoFocus);
	//table->setEditTriggers(QAbstractItemView::DoubleClicked);

	table->horizontalHeader()->setHighlightSections(false);         //点击表头时不对表头高亮 

	//table->setRowCount(3); //设置行数
	table->setColumnCount(heads.size()); //设置列数
	table->horizontalHeader()->setDefaultSectionSize(w / heads.size() + 1);
	table->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter | Qt::AlignVCenter);
	table->verticalHeader()->hide();
	table->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
	table->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

	//设置不可改变列宽
	table->horizontalHeader()->setDisabled(true);

	//固定列宽
	table->setColumnWidth(0,40);
	table->setColumnWidth(1, 135);
	table->setColumnWidth(2, 40);

	QStringList header;
	for each (const char* var in heads)
	{
		auto textName = QString::fromLocal8Bit(var);
		header << textName;
	}
	table->setHorizontalHeaderLabels(header);
	table->show();

	return table;
}

添加底部4个按钮代码:

QWidget* popDataLabel::addTableBottomBtn(int x, int y)
{
	auto btn = addPushBtn(eScbtn_previouspage_list1,x,y,50,24,"上一页");
	((QPushButton*)getWidget(eScbtn_previouspage_list1))->setAutoExclusive(false);

	auto btn3 = addPushBtn(eScbtn_page1_list1,x + 53, y , 24, 24,"1");
	auto btn4 = addPushBtn(eScbtn_page2_list1,x + 53 + 27, y , 24, 24, "2");
	auto btn5 = addPushBtn(eScbtn_page3_list1,x + 53 + 27 + 27,  y , 24, 24,"3");
	auto btn6 = addPushBtn(eScbtn_page4_list1, x + 53 + 27 + 27 + 27, y , 24, 24, "4");

	((QPushButton*)getWidget(eScbtn_page1_list1))->setAutoExclusive(false);
	((QPushButton*)getWidget(eScbtn_page1_list1))->setChecked(true);

	BtnGroupB = new QButtonGroup;
	BtnGroupB->addButton((QAbstractButton *)btn3, 0);
	BtnGroupB->addButton((QAbstractButton *)btn4, 1);
	BtnGroupB->addButton((QAbstractButton *)btn5, 2);
	BtnGroupB->addButton((QAbstractButton *)btn6, 3);
	BtnGroupB->setExclusive(true);

	addPushBtn(eScbtn_nextpage_list1, x + 53 + 27 + 27 + 27 + 33 , y, 50, 24, "下一页");
	((QPushButton*)getWidget(eScbtn_nextpage_list1))->setAutoExclusive(false);

	addPushBtn(eScbtn_previouspage_list2, x, y + 183, 50, 24, "上一页");
	((QPushButton*)getWidget(eScbtn_previouspage_list2))->setAutoExclusive(false);

	auto btn7 = addPushBtn(eScbtn_page1_list2, x + 53, y + 183, 24, 24, "1");
	auto btn8 = addPushBtn(eScbtn_page2_list2, x + 53 + 27, y + 183, 24, 24, "2");
	auto btn9 = addPushBtn(eScbtn_page3_list2, x + 53 + 27 + 27, y + 183, 24, 24, "3");
	auto btn10 = addPushBtn(eScbtn_page4_list2, x + 53 + 27 + 27 + 27, y + 183, 24, 24, "4");
	((QPushButton*)getWidget(eScbtn_page1_list2))->setAutoExclusive(false);
	((QPushButton*)getWidget(eScbtn_page1_list2))->setChecked(true);

	BtnGroupC = new QButtonGroup;
	BtnGroupC->addButton((QAbstractButton *)btn7, 0);
	BtnGroupC->addButton((QAbstractButton *)btn8, 1);
	BtnGroupC->addButton((QAbstractButton *)btn9, 2);
	BtnGroupC->addButton((QAbstractButton *)btn10,3);
	BtnGroupC->setExclusive(true);

	addPushBtn(eScbtn_nextpage_list2, x + 53 + 27 + 27 + 27 + 33, y + 183, 50, 24, "下一页");
	((QPushButton*)getWidget(eScbtn_nextpage_list2))->setAutoExclusive(false);

	return btn;
}

设置底部按钮的数字,超过4页的时候,切换数字显示

void popDataLabel::setBottomBtnNum(int index,const char* btn1, const char* btn2, const char* btn3, const char* btn4)
{
	if (index == eRkbtn_biaoqian_picvideo_list1)
	{
		((QPushButton*)m_btnsIndex[eScbtn_page1_list1])->setText(btn1);
		((QPushButton*)m_btnsIndex[eScbtn_page2_list1])->setText(btn2);
		((QPushButton*)m_btnsIndex[eScbtn_page3_list1])->setText(btn3);
		((QPushButton*)m_btnsIndex[eScbtn_page4_list1])->setText(btn4);
	}
	else if(index == eRkbtn_attachment_list2)
	{
		((QPushButton*)m_btnsIndex[eScbtn_page1_list2])->setText(btn1);
		((QPushButton*)m_btnsIndex[eScbtn_page2_list2])->setText(btn2);
		((QPushButton*)m_btnsIndex[eScbtn_page3_list2])->setText(btn3);
		((QPushButton*)m_btnsIndex[eScbtn_page4_list2])->setText(btn4);
	}
}

添加Table的item项,item最后添加删除按钮:

void popDataLabel::appendTableItem(int index,const char * name,int nserial)
{
	auto table = (QTableWidget*)getWidget(index);
	int crowCount = table->rowCount();
	//插入数据
	table->insertRow(crowCount);
	auto j = 0;
	auto item = new QTableWidgetItem(QString::number(crowCount));
	item->setText(QString::number(nserial));
	item->setTextAlignment(Qt::AlignCenter);
	table->setItem(crowCount, j, item);
	j++;

	auto textName = QString::fromLocal8Bit(name);
	item = new QTableWidgetItem(textName);
	item->setText(textName);
	item->setTextAlignment(Qt::AlignCenter);
	table->setItem(crowCount, j, item);
	j++;

	//加入删除按钮
	QToolButton * btn = (QToolButton *)addToolBtn(eDataLabelbtn_delete, 0, 0, 14, 16, "删除");
	if (index == eRkbtn_biaoqian_picvideo_list1)
	{
		btn->setProperty("list1item", nserial);
		connect(btn, &QToolButton::clicked, this, &popDataLabel::OnBtnTableDeleteClicked1);
	}
	else if(index == eRkbtn_attachment_list2)
	{
		btn->setProperty("list2item", nserial);
		connect(btn, &QToolButton::clicked, this, &popDataLabel::OnBtnTableDeleteClicked2);
	}
	
	table->setCellWidget(crowCount,j,btn);
	table->setRowHeight(crowCount,28);
	table->setAutoScroll(false);
}

响应第一个表格删除按钮:

void popDataLabel::OnBtnTableDeleteClicked1()
{
/*	QToolButton * pBtn = dynamic_cast<QToolButton*>(QObject::sender());
	if (pBtn == NULL)
		return;
	
	int x = pBtn->parentWidget()->frameGeometry().x();
	int y = pBtn->parentWidget()->frameGeometry().y();
	
	QTableWidget * table =(QTableWidget *)getWidget(eRkbtn_biaoqian_picvideo_list1);
	QModelIndex index = table->indexAt(QPoint(x,y));
	int row = index.row();

	QTableWidgetItem *item = table->item(row,0);*/

	QToolButton * pBtn = dynamic_cast<QToolButton*>(QObject::sender());
	if (NULL == pBtn)
	{
		return;
	}
	int value = pBtn->property("list1item").toInt();
	auto table = (QTableWidget *)getWidget(eRkbtn_biaoqian_picvideo_list1);

	QString path = m_listpicvideo[value - 1];
	m_listpicvideo.remove(value - 1);

	QVector<QString>::iterator iter;

	round1:
	for (iter = m_exInfo.begin(); iter != m_exInfo.end(); iter++)
	{
		if (*iter == path)
		{
			m_exInfo.erase(iter);
			goto round1;
		}
	}
	
	updatePicUI();
}

响应第二个表格删除按钮:

void popDataLabel::OnBtnTableDeleteClicked2()
{
/*	QToolButton * pBtn = dynamic_cast<QToolButton*>(QObject::sender());
	if (pBtn == NULL)
		return;

	int x = pBtn->parentWidget()->frameGeometry().x();
	int y = pBtn->parentWidget()->frameGeometry().y();

	QTableWidget * table = (QTableWidget *)getWidget(eRkbtn_attachment_list2);
	QModelIndex index = table->indexAt(QPoint(x, y));
	int row = index.row();

	QTableWidgetItem *item = table->item(row, 0);*/

	QToolButton * pBtn = dynamic_cast<QToolButton*>(QObject::sender());
	if (NULL == pBtn)
	{
		return;
	}
	int value = pBtn->property("list2item").toInt();
	auto table = (QTableWidget *)getWidget(eRkbtn_attachment_list2);

	QString path = m_listattachment[value - 1];
	m_listattachment.remove(value - 1);

	QVector<QString>::iterator iter;

	round2:
	for (iter = m_exInfo.begin(); iter != m_exInfo.end(); iter++)
	{
		if (*iter == path)
		{
			m_exInfo.erase(iter);
			goto round2;
		}
	}

	updatePicUI();
}

响应点击上传图片,附件,判断是否重复,重复则不进行上传:

case eScbtn_update0:
		{
			QFileDialog *fileDialog = new QFileDialog(this);
			fileDialog->setWindowTitle(QStringLiteral("选择图片/视频文件"));
			fileDialog->setNameFilter(tr("File(*.png* *.jpg* *.avi* *.mp4*)"));
			//设置视图模式
			fileDialog->setViewMode(QFileDialog::Detail);
			//获取选择的文件的路径
			QStringList fileNames;
			bool bIsRepeat = false;
			if (fileDialog->exec()) 
			{
				fileNames = fileDialog->selectedFiles();
				for(int i = 0; i < m_exInfo.size(); i++)
				{
					if (m_exInfo[i] == fileNames[0])
					{
						bIsRepeat = true;
					}
				}
				if (!bIsRepeat)
				{
					m_exInfo.append(fileNames[0]);
					m_listpicvideo.append(fileNames[0]);
				}
			}

			updatePicUI();
		}break;

显示图片

void popDataLabel::show_img_list1(int row, int col)
{
	auto table = (QTableWidget*)getWidget(eRkbtn_biaoqian_picvideo_list1);
	auto id = table->item(row, 0)->text().toInt();
	QString path = m_listpicvideo[id - 1];
	upImg(path.toLocal8Bit().constData());
}

void popDataLabel::show_img_list2(int row, int col)
{
	auto table = (QTableWidget*)getWidget(eRkbtn_attachment_list2);
	auto id = table->item(row, 0)->text().toInt();
	QString path = m_listattachment[id - 1];
	upImg1("d:/文件类型-缩略图-文本.png");
}

Table的显示,计算有几页。如果一页显示三个item,则QVector中取三个。

void popDataLabel::TableShow()
{
	if (!m_listpicvideo.isEmpty())
	{
		int iter_max1 = 3 * m_nTopSelectedPage;
		for (int iter = 3 * m_nTopSelectedPage - 3; iter < iter_max1; iter++)
		{
			QFileInfo fileInfo;
			if (iter < m_listpicvideo.count())
			{
				QString path = m_listpicvideo.at(iter);
				fileInfo = QFileInfo(path);
				QString name = fileInfo.baseName();
				auto listNum = iter + 1;
				appendTableItem(eRkbtn_biaoqian_picvideo_list1, name.toLocal8Bit().constData(),listNum);
			}
		}
	}
	
	if (!m_listattachment.isEmpty())
	{
		int iter_max2 = 2 * m_nBottomSelectedPage;
		for (int iter = 2 * m_nBottomSelectedPage - 2; iter < iter_max2;iter++)
		{
			QFileInfo fileInfo;
			if (iter < m_listattachment.count())
			{
				QString path = m_listattachment.at(iter);
				fileInfo = QFileInfo(path);
				QString name = fileInfo.baseName();
				auto listNum = iter + 1;
				appendTableItem(eRkbtn_attachment_list2, name.toLocal8Bit().constData(),listNum);
			}
		}
	}
}

更新显示图片

void popDataLabel::upImg(const char * path)
{
	auto imgs = (RenkouUi_Picture*)getWidget(eRkbtn_pic_video_img);
	imgs->setImg(QString::fromLocal8Bit(path));
}

void popDataLabel::upImg1(const char * path)
{
	auto imgs = (RenkouUi_Picture*)getWidget(eRkbtn_attachment_img);
	imgs->setImg(QString::fromLocal8Bit(path));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

My点点滴滴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值