qt自定义listview增删

  • 自定义listview,准确来说应该是listwidget,根据自己需求,需要一些特殊的列表。
  • 这里例子是,一个主界面,可以添加两个球队名进行比赛,也可以删除已经添加的,时间这里默认10秒钟,点击开始后,开始每秒轮换产生随机得分直至结束。
  • 大致就这么个意思,主要是为了练习,先看下实现的效果图,后面再看具体实现代码
    在这里插入图片描述
  • 1 首先对比下面运行图和设计界面,分解下界面的组成,
  • 图中③部分在设计界面,只是一个scrollArea及其里面有一个垂直布局,通过
    ui->verticalLayout_3->addWidget(form_2), 加入子界面到scrollArea布局中,从而实现运行图中的多个列表。
  • ui->verticalLayout_3为该设计界面中scrollArea布局名称,form_2为创建的QWidget对象。
  • 运行图
    在这里插入图片描述
  • 设计界面
    在这里插入图片描述
  • 2 列表实现,每一项的格式界面,是先设计好form界面布局,再加入到主布局中,列表中每一项的具体布局如图。
    在这里插入图片描述
  • 3 添加和删除方面,就是通过调用对象方法来操作,具体可以看代码。
  • 3.1 先看下整体有哪些文件
    在这里插入图片描述
  • 3.2 这里主要是form.h、form.cpp、widget.h、widget.cpp,ui布局参照图片,但注意控件名字,其他正常新建一个程序,然后加上这几个文件即可。
  • form.h
#ifndef FORM_H
#define FORM_H

#include <QWidget>
#include <QTimer>
#include <QMouseEvent>
namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT

public:
    explicit Form(QString ,QString,QWidget *parent = nullptr);
    ~Form();
    void setShowCheck(bool);   //设置显示或隐藏
    void setChecked(bool);     //设置选中或未选中
    bool isChecked();         //判断是否选中未选中
private slots:
    void dealtimer();
    void on_pushButton_start_clicked();

protected:
    void mousePressEvent(QMouseEvent *event);
private:
    Ui::Form *ui;
    QTimer *m_timer;
    int score_1 = 0;
    int score_2 = 0;
    int flag = 0;
};
#endif // FORM_H
  • form.cpp
#include "form.h"
#include "ui_form.h"
#include <QTime>
Form::Form(QString name1,QString name2,QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
    this->setFixedHeight(80);                         //设置界面
    this->setObjectName("form");
    this->setAttribute(Qt::WA_StyledBackground,true); //子界面需要加这个才能修改背景

    //hover表示鼠标移动到form界面时的样式
    this->setStyleSheet("QWidget#form{background-color:rgb(255,255,255)}"
                        "QWidget#form:hover{background-color:rgb(203,203,203)}QLabel{color:rgb(0,0,0);}");

    ui->label_icon_1->setObjectName("icon");
    ui->label_icon_2->setObjectName("icon");
    ui->label_icon_1->setPixmap(QPixmap(":/src/logo.png").scaled(20,20,
                                                                 Qt::KeepAspectRatio,Qt::SmoothTransformation));
    ui->label_icon_2->setPixmap(QPixmap(":/src/logo.png").scaled(20,20,
                                                                 Qt::KeepAspectRatio,Qt::SmoothTransformation));

    ui->label_name_1->setText(name1);
    ui->label_name_2->setText(name2);

    //<font style='font-size:16px;'>0</font>设置字体大小
    ui->label_score_1->setText("<font style='font-size:16px;'>0</font>");   
    ui->label_score_2->setText("<font style='font-size:16px;'>0</font>");

    ui->label_score_1->setFixedWidth(50);
    ui->label_score_2->setFixedWidth(50);

    ui->label_time->setFixedWidth(50);
    ui->label_time->hide();

    ui->label_vs->setFixedWidth(50);

    ui->checkBox->setFixedSize(30,30);
    ui->checkBox->hide();

    m_timer = new QTimer(this);
    connect(m_timer,SIGNAL(timeout()),this,SLOT(dealtimer()));

    qsrand(time(NULL));//种随机种子,这样后面才能产生随机数,不加这个,产生的是伪随机数
}

void Form::setShowCheck(bool bl)
{
    ui->checkBox->setChecked(false);
    if(bl)
        ui->checkBox->show();
    else
        ui->checkBox->hide();
}

void Form::setChecked(bool bl)
{
    if(bl)
         ui->checkBox->setChecked(true);
    else
        ui->checkBox->setChecked(false);
}

bool Form::isChecked()
{
    if(ui->checkBox->isChecked())
        return true;
    return false;
}

//定时器触发
void Form::dealtimer()
{
    int score = qrand()%3;  //产生随机数,表示0~3的随机数
    flag++;
    ui->label_time->setText(QString("%1秒").arg(10-flag));
    if(flag == 11){
        m_timer->stop();    //定时器停止
        ui->pushButton_start->setText("已结束");
        ui->label_time->hide();
        flag = 0;
        score_1 = 0;
        score_2 = 0;
    }else if(flag%2 == 0){
        score_1+=score;
        ui->label_score_1->setText(QString("<font style='font-size:16px;'>%1</font>").arg(score_1));
    }else if(flag%2 == 1){
        score_2+=score;
        ui->label_score_2->setText(QString("<font style='font-size:16px;'>%1</font>").arg(score_2));
    }
}

//鼠标点击该界面时执行
void Form::mousePressEvent(QMouseEvent *event)
{
    if(ui->checkBox->isHidden())
        return;
    if(ui->checkBox->isChecked())
        ui->checkBox->setChecked(false);
    else
        ui->checkBox->setChecked(true);
}

//点击开始比赛时执行
void Form::on_pushButton_start_clicked()
{
    m_timer->start(1000);                   //定时器以1000毫秒即1秒每次开始执行
    ui->pushButton_start->setEnabled(false); //设置按钮不可点击
    ui->pushButton_start->setText("进行中...");
    ui->label_time->show();
    ui->label_time->setText("10秒");
}

Form::~Form()
{
    delete ui;
}
  • form.ui
    在这里插入图片描述
  • widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QList>
#include "form.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:

    void on_pushButton_edit_clicked();

    void on_pushButton_add_clicked();

    void on_pushButton_all_clicked();

    void on_pushButton_delete_clicked();

private:
    Ui::Widget *ui;
    QList<Form*> m_list;//form对象列表
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowTitle("NBA");                    //设置标题
    this->setWindowIcon(QIcon(":/src/winicon.png"));//设置图标
    ui->widget_title->setObjectName("widget_title");//设置名字
    ui->label->setObjectName("label");
    ui->label_2->setObjectName("label");
    ui->label_3->setObjectName("label");

    //设置控件类型为QWidget名为widget_title的 background-color背景色
    //设置控件类型为QLabel的 color字体颜色  设置控件类型为QLabel名为label的字体颜色
    this->setStyleSheet("QWidget#widget_title{background-color:rgb(202,58,56)}"
                        "QLabel{color:rgb(255,255,255);}QLabel#label{color:rgb(0,0,0)}");

    ui->widget_title->setFixedHeight(100);          //设置界面高度

    //通过QLabel类型的控件设置图片  100,80是图片宽和高
    ui->label_icon->setPixmap(QPixmap(":/src/icon.png")
                              .scaled(100,80,Qt::KeepAspectRatio,Qt::SmoothTransformation));

    ui->label_title->setText("<b>美国职业篮球联赛</b>");//<b></b>是加粗字体
    ui->label_time->setText("2020-2021");            //设置文本内容

    ui->scrollArea->setFrameShape(QFrame::NoFrame);  //设置无边框
    ui->widget_edit->hide();                         //设置隐藏

    //先添加三个
    Form *form = new Form("湖人","火箭");
    ui->verticalLayout_3->addWidget(form);            //加入布局
    Form *form_1 = new Form("勇士","马刺");
    ui->verticalLayout_3->addWidget(form_1);
    Form *form_2 = new Form("热火","雷霆");
    ui->verticalLayout_3->addWidget(form_2);

    //将创建好的对象加入列表,以便后面调用
    m_list.append(form);
    m_list.append(form_1);
    m_list.append(form_2);
}

//点击添加赛程按钮时执行
void Widget::on_pushButton_add_clicked()
{
    //点击按钮获取输入框内容,加入列表
    QString name1 = ui->lineEdit->text();
    QString name2 = ui->lineEdit_2->text();

    Form *form = new Form(name1,name2,ui->scrollAreaWidgetContents);
    ui->verticalLayout_3->addWidget(form);//加入布局
    m_list.append(form);                  //将创建好的对象加入列表,以便后面调用
}

//点击全选或取消全选按钮时执行
void Widget::on_pushButton_all_clicked()
{
    /* 通过判断按钮上的文字内容,来执行不同的操作
     * 点击按钮时:
     * 1、当内容为全选 则设置每个form选框全部为选中状态,     并修改按钮文本为取消全选
     * 2、当内容为取消全选 则设置每个form选框全部为未选中状态,并修改按钮文本为全选
     */
    if(ui->pushButton_all->text() == QString::fromLocal8Bit("全选")){
        for (int var = 0; var < m_list.length(); ++var) {
           m_list.at(var)->setChecked(true);
        }
        ui->pushButton_all->setText("取消全选");
     }else{
        for (int var = 0; var < m_list.length(); ++var) {
           m_list.at(var)->setChecked(false);
        }
        ui->pushButton_all->setText("全选");
    }
}


//点击删除按钮时执行
void Widget::on_pushButton_delete_clicked()
{
    /* 点击删除时,调用每个界面的函数判断选框是否为选中状态
     * 为选中状态的form则删除
     */
    for (int var = 0; var < m_list.length(); ++var) {
       if(m_list.at(var)->isChecked()){
           ui->verticalLayout_3->removeWidget(m_list.at(var));
           delete m_list.at(var);
           m_list.removeAt(var);//这里列表删除元素后,相应下标也发生变化,所以var也要减一才能,正常判断后面的
           var--;
       }
    }
    qDebug()<<m_list.length();
}
//点击编辑按钮是执行
void Widget::on_pushButton_edit_clicked()
{
    /* 通过判断按钮上的文字内容,来执行不同的操作
     * 点击按钮时:
     * 1、当内容为编辑 则设置每个form选框显示,并修改按钮文本为取消
     * 2、当内容为取消 则设置每个form选框隐藏,并修改按钮文本为编辑
     */
    if(ui->pushButton_edit->text() == QString::fromLocal8Bit("编辑")){
        ui->pushButton_all->setText("全选");
        ui->widget_edit->show();
        ui->pushButton_edit->setText("取消");
        for (int var = 0; var < m_list.length(); ++var) {
           m_list.at(var)->setShowCheck(true);
        }
        ui->pushButton_add->setEnabled(false);
    }else{
        ui->widget_edit->hide();
        ui->pushButton_edit->setText("编辑");
        for (int var = 0; var < m_list.length(); ++var) {
           m_list.at(var)->setShowCheck(false);
        }
        ui->pushButton_add->setEnabled(true);
    }
}


Widget::~Widget()
{
    delete ui;
}
  • widget.ui
    在这里插入图片描述
  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值