Ui
代码
//.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QStringListModel>
#include <QListView>
#include <QStringList>
#include <QFont>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QModelIndex index() const;
void setIndex(const QModelIndex &newIndex);
public Q_SLOTS:
//在末尾添加新项
bool addItem(const QString& itemData);
//在指定索引的行后插入新项
bool insertAfterItem(const QModelIndex& index,const QString& itemData);
//在指定索引的行前插入新项
bool insertBeforeItem(const QModelIndex& index,const QString& itemData);
//删除选中的视图的当前索引的项
bool removeCurrentItem(const QModelIndex& index);
//清空列表
void clearList();
//视图排序
void sortView();
//获取选择的行的数据
QVariant getChooseRowData(const QModelIndex& index);
private:
Ui::MainWindow *ui;
QStringList m_Data{};
QStringListModel* m_Model;
//存储点击视图行的索引
QModelIndex m_index{};
};
#endif // MAINWINDOW_H
//.cpp文件
#include "mainwindow.h"
#include "./ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow),m_Model(new QStringListModel(this))
{
ui->setupUi(this);
qDebug()<<m_Model->supportedDragActions();
qDebug()<<m_Model->supportedDropActions();
m_Data<<"s1"<<"a2"<<"d3";
m_Model->setStringList(m_Data);
//设置视图的数据可拖动
ui->listView->setDragEnabled(true);
ui->listView->setAcceptDrops(true);
ui->listView->setDropIndicatorShown(true);
ui->listView->setDragDropMode(QAbstractItemView::InternalMove);
//设置视图数据的字体
ui->listView->setFont(QFont("微软雅黑",15));
//设置视图数据的间距
ui->listView->setSpacing(10);
//设置视图数据的模型
ui->listView->setModel(m_Model);
ui->newData->setPlaceholderText("在此输入要添加的项的数据!");
ui->dataLine->setPlaceholderText("此处显示选择的项的数据!");
connect(ui->sortBut,&QPushButton::clicked,this,&MainWindow::sortView);
connect(ui->addBut,&QPushButton::clicked,this,[this](){
if(!ui->newData->text().isEmpty())
{
this->addItem(ui->newData->text());
}
});
connect(ui->listView,&QListView::clicked,this,&MainWindow::setIndex);
connect(ui->insertBut,&QPushButton::clicked,this,[this](){
if(!ui->newData->text().isEmpty())
{
this->insertAfterItem(this->index(),ui->newData->text());
}
});
connect(ui->removeBut,&QPushButton::clicked,this,[this](){
this->removeCurrentItem(this->index());
});
connect(ui->clearBut,&QPushButton::clicked,this,&MainWindow::clearList);
connect(ui->getData,&QPushButton::clicked,this,[this](){
ui->dataLine->setText(this->getChooseRowData(this->m_index).toString());
});
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::addItem(const QString &itemData)
{
//插入空行
auto isInsertNewLine= m_Model->insertRows(m_Model->rowCount(),1);
if(!isInsertNewLine)
{
qDebug()<<"addItem 插入空行失败";
return false;
}
//添加新数据
auto isAddData= m_Model->setData(m_Model->index(m_Model->rowCount()-1),itemData,Qt::EditRole);
if(!isAddData)
{
qDebug()<<"addItem 添加新数据失败";
return false;
}
return true;
}
bool MainWindow::insertBeforeItem(const QModelIndex &index, const QString &itemData)
{
if(!index.isValid())
{
qDebug()<<"insertBeforeItem index failed";
return false;
}
//插入空行
auto isInsertNewLine= m_Model->insertRows(index.row(),1);
if(!isInsertNewLine)
{
qDebug()<<"insertBeforeItem 插入空行失败";
return false;
}
//添加新数据
auto isAddData= m_Model->setData(m_Model->index(index.row()),itemData,Qt::EditRole);
if(!isAddData)
{
qDebug()<<"insertBeforeItem 添加新数据失败";
return false;
}
return true;
}
bool MainWindow::insertAfterItem(const QModelIndex& index, const QString &itemData)
{
if(!index.isValid())
{
qDebug()<<"insertAfterItem index failed";
return false;
}
//插入空行
auto isInsertNewLine= m_Model->insertRows(index.row()+1,1);
if(!isInsertNewLine)
{
qDebug()<<"insertAfterItem 插入空行失败";
return false;
}
//添加新数据
auto isAddData= m_Model->setData(m_Model->index(index.row()+1),itemData,Qt::EditRole);
if(!isAddData)
{
qDebug()<<"insertAfterItem 添加新数据失败";
return false;
}
return true;
}
bool MainWindow::removeCurrentItem(const QModelIndex& index)
{
if(!index.isValid())
{
qDebug()<<"removeCurrentItem index failed";
return false;
}
m_Model->removeRows(index.row(),1);
return true;
}
void MainWindow::clearList()
{
for(int i=m_Model->rowCount()-1;i>=0;--i)
{
m_Model->removeRows(i,1);
}
}
void MainWindow::sortView()
{
m_Model->sort(0);
}
QVariant MainWindow::getChooseRowData(const QModelIndex &index)
{
if(!index.isValid())
{
qDebug()<<"getChooseRowData index failed";
return QVariant{};
}
return m_Model->data(index);
}
QModelIndex MainWindow::index() const
{
return m_index;
}
void MainWindow::setIndex(const QModelIndex &newIndex)
{
m_index = newIndex;
}
操作
20250402-1445
注意
循环使用removeRows删除项时需要从后往前删除,因为从前往后删除可能会导致索引失效
使用setData时role参数一般使用Qt::EditRole
QStringListModel的数据默认可编辑
支持的操作
QFlagsQt::DropAction(CopyAction|MoveAction)
QFlagsQt::DropAction(CopyAction|MoveAction)
rowCount()返回的值从1开始,而行的索引是从0开始
…