思路:把路径保存在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));
}


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

7832

被折叠的 条评论
为什么被折叠?



