qt-内置图片遍历-Lambda按钮

内置图片遍历-Lambda按钮

知识点

使用新的connect语法连接信号和槽 --Lambda 使用

cpp 复制代码
connect(btn, &QToolButton::clicked, this, [this, btn,index]() {  
    onToolButtonClicked(btn)}); // Lambda表达式中调用成员函数,并传递btn  
槽函数中使用
onToolButtonClicked


void Widget::onToolButtonClicked(QToolButton *button)
{
    bool ok;
    int index = button->text().toInt(&ok);
    if (ok) {
        // 显示序号,这里以QMessageBox为例
        qDebug() <<index;
    }
}

Qt遍历枚举容器

cpp 复制代码
   auto me = QMetaEnum::fromType<QStyle::StandardPixmap>();
    for(int i = 0; i < me.keyCount(); i++) {
        qDebug() << me.key(i) << me.value(i);
    }

widget.h

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include <QLabel>
#include <QComboBox>
#include <QToolButton>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void init();
private slots:
    void changeStyle(const QString &text);
    void onToolButtonClicked(QToolButton *button);
private:
    QComboBox *comboBox;
    QLabel *labelStyle;
};
#endif // WIDGET_H

widget.cpp

cpp 复制代码
#include "widget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QComboBox>
#include <QToolButton>
#include <QApplication>
#include <QStyleFactory>
#include <QDebug>
#include <QObject>
#include <QMetaEnum>
#include <QLabel>
#include <QMessageBox>


const int ROW = 8;
const int COL = 10;

Widget::Widget(QWidget *parent)
    : QWidget(parent),
    comboBox(nullptr),
    labelStyle(nullptr)
{
    init();
}

Widget::~Widget()
{
}

void Widget::init()
{
    labelStyle = new QLabel(QStringLiteral("风格:"));
    comboBox = new QComboBox;
    connect(comboBox,  QOverload<const QString &>::of(&QComboBox::currentIndexChanged), this, &Widget::changeStyle);
    comboBox->addItems(QStyleFactory::keys());

    auto hLayout = new QHBoxLayout;
    hLayout->addWidget(labelStyle);
    hLayout->addWidget(comboBox);
    hLayout->setStretch(1, 1);

    auto gridLayout = new QGridLayout;
    auto me = QMetaEnum::fromType<QStyle::StandardPixmap>();
    for(int i = 0; i < me.keyCount(); i++) {
        qDebug() << me.key(i) << me.value(i);
    }
    int index = 0;
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j < COL; j++) {
            if (index < me.keyCount()) {
                auto btn = new QToolButton;
                btn->setToolButtonStyle(Qt::ToolButtonFollowStyle);
                btn->setText(QStringLiteral("%1").arg(index));
                btn->setIcon(QApplication::style()->standardIcon(QStyle::StandardPixmap(index)));
                btn->setIconSize(QSize(40, 40));
                //添加事件
                connect(btn, &QToolButton::clicked, this, [this, btn, index]() {
                    onToolButtonClicked(btn);
                });
                gridLayout->addWidget(btn, i, j, Qt::AlignCenter);
                index++;
            }
        }
    }
   
    auto vLayout = new QVBoxLayout;
    vLayout->addLayout(hLayout);
    vLayout->addLayout(gridLayout);

    this->setLayout(vLayout);
    this->setWindowTitle(QStringLiteral("Qt内置标准图标Demo"));
}

void Widget::changeStyle(const QString &text)
{
    QApplication::setStyle(text);
}

void Widget::onToolButtonClicked(QToolButton *button)
{
    bool ok;
    int index = button->text().toInt(&ok);
    if (ok) {
        // 显示序号,这里以QMessageBox为例
        qDebug() <<index;
          QMessageBox::information(this, "序号", QString("你点击了序号 %1").arg(index));
    }
}

main.cpp

cpp 复制代码
#include "widget.h"

#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

#ifdef QT_NO_DEBUG
    qDebug() << "Release mode:";
#else
    qDebug() << "Debug mode:";
#endif
    Widget w;
    w.show();
    return a.exec();
}

运行图

相关推荐
我爱Jack1 分钟前
时间与空间复杂度详解:算法效率的度量衡
java·开发语言·算法
米饭「」3 分钟前
C++AVL树
java·开发语言·c++
心愿许得无限大35 分钟前
Qt 常用界面组件
开发语言·c++·qt
2401_858286111 小时前
OS15.【Linux】gdb调试器的简单使用
linux·运维·服务器·开发语言·gdb
牛马baby1 小时前
MATLAB下载安装教程(附安装包)2025最新版(MATLAB R2024b)
开发语言·matlab
shenyan~1 小时前
关于 c、c#、c++ 三者区别
开发语言·c++
Ashlee_code1 小时前
什么是Web3?金融解决方案
开发语言·金融·架构·eclipse·web3·区块链·php
Evand J1 小时前
【MATLAB例程】AOA与TDOA混合定位例程,适用于三维环境、4个锚点的情况,附下载链接
开发语言·matlab
机器视觉知识推荐、就业指导1 小时前
Qt 与Halcon联合开发八: 结合Qt与Halcon实现海康相机采图显示(附源码)
开发语言·数码相机·qt
Heartoxx2 小时前
c语言-指针与一维数组
c语言·开发语言·算法