效果图如下:
思路是将需要轮播的窗口重载一个类,放入QStackedWidget中,通过定时器和QPushButton控制QStackedWidget中的窗口切换实现轮播效果。
重载一个窗口类命名ImageItemWidget
轮播窗口类参数设置
class ImageInfo
{
public:
QString logoPath; //头像
QString nickName; //头像说明
int64_t score; //颜值
public:
void clear() {
logoPath.clear();
nickName.clear();
score = 0;
}
};
轮播窗口类参数导入
void ImageItemWidget::setValueAndStyle(ImageInfo pEvent)
{
QFontMetrics fm(ui.label_uname->font());
QString strElidedText = fm.elidedText(pEvent.nickName, Qt::ElideRight, 90, Qt::TextShowMnemonic);
ui.label_uname->setText(strElidedText);
QString grade = QString::number(pEvent.score);
ui.label_grade->setText(QStringLiteral("颜值:%1").arg(grade));
QString _logoPath = QStringLiteral(":/image/qrc/image/%1").arg(pEvent.logoPath);
QPixmap logo(_logoPath);
if (!logo.isNull()) {
ui.label_frame->setScaledContents(true);
ui.label_frame->setPixmap(logo);
}
}
创建显示轮播窗口类ImageCarouselWidget
//数据
for (int i = 0; i < 5; i++)
{
ImageInfo _pInfo;
_pInfo.nickName = QStringLiteral("美女%1").arg(i + 1);
_pInfo.logoPath = QStringLiteral("%1.jpg").arg(i + 1);
_pInfo.score = 10000 + i * 1000;
m_imageItem = new ImageItemWidget();
m_imageItem ->setValueAndStyle(_pInfo);
ui.stackedWidget->insertWidget(i, m_annualItem);
m_ImageInfo.insert(i, _pInfo);
}
轮播按钮创建
void ImageCarouselWidget::initChangeButton()
{
m_ChangeButtonGroup = new QButtonGroup();
int listCount = m_ImageInfo.count();
ui.horizontalLayout->addStretch();
for (int i = 0; i < listCount; i++)
{
//初始化轮播按钮
QPushButton* pButton = new QPushButton;
pButton->setFixedSize(QSize(13, 13));
pButton->setCheckable(true);
pButton->setStyleSheet("QPushButton{border-image:url(:/ToolTip/qrc/unselect1.png);}\
QPushButton:checked{border-image:url(:/ToolTip/qrc/select1.png);}");
m_ChangeButtonGroup->addButton(pButton, i);
m_pChangeButtonList.append(pButton);
ui.horizontalLayout->addWidget(pButton);
}
ui.horizontalLayout->addStretch();
ui.horizontalLayout->setSpacing(20);
ui.horizontalLayout->setMargin(0);
//默认第一个显示
if (m_pChangeButtonList.size() > 0) {
m_pChangeButtonList[0]->setChecked(true);
}
connect(m_ChangeButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(sltSwitchButtonClicked(int)));
}
轮播按钮槽函数切换窗口实现
void ImageCarouselWidget::sltSwitchButtonClicked(int index)
{
initChangeButtonCheckable(index);
}
void ImageCarouselWidget::initChangeButtonCheckable(int index)
{
if (m_pChangeButtonList.size() > index) {
m_pChangeButtonList[index]->setChecked(true);
}
m_carouselTimer.stop();
m_carouselTimer.start(3000);
ui.stackedWidget->setCurrentIndex(index);
}
创建并初始化定时器
m_carouselTimer.setTimerType(Qt::PreciseTimer);
connect(&m_carouselTimer, &QTimer::timeout, this, &vAnnualEvent::sltCarouselTimerOut);
m_carouselTimer.start(3000);
定时器槽函数控制窗口轮播
void ImageCarouselWidget::sltCarouselTimerOut()
{
int pIndex= ui.stackedWidget->currentIndex();
int pCount = ui.stackedWidget->count();
// 获取下一个需要显示的页面索引
++pIndex;
// 当需要显示的页面索引大于等于总页面时,切换至首页
if (pIndex>= pCount) pIndex= 0;
initChangeButtonCheckable(pIndex);
ui.stackedWidget->setCurrentIndex(pIndex);
}