- 自定义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