QT 视图(view)模型(model)汇总

QStringListModel和QListView

UI界面

widget头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QStringList>
#include <QStringListModel>
#include <QWidget>

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_clicked();

    void on_pushButton_2_clicked();

    void on_checkBox_clicked(bool checked);

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_6_clicked();

    void on_pushButton_8_clicked(bool checked);

    void on_pushButton_9_clicked();

    void on_pushButton_10_clicked();

    void on_listView_clicked(const QModelIndex& index);

private:
    Ui::Widget* ui;
    QStringList m_strList;
    QStringListModel* m_model;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QStandardItemModel>>
Widget::Widget(QWidget* parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_strList << "北京"
              << "上海"
              << "山西"
              << "南京";
    m_model = new QStringListModel(this);
    m_model->setStringList(m_strList);
    ui->listView->setModel(m_model);
    ui->listView->setEditTriggers(QAbstractItemView::EditTrigger::DoubleClicked | QAbstractItemView::EditTrigger::SelectedClicked);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    m_model->setStringList(m_strList);
}

void Widget::on_pushButton_2_clicked()
{
    m_model->removeRows(0, m_model->rowCount()); //删除行
}

void Widget::on_checkBox_clicked(bool checked)
{
    if (checked) {
        ui->listView->setEditTriggers(QAbstractItemView::EditTrigger::DoubleClicked | QAbstractItemView::EditTrigger::SelectedClicked);

    } else {
        ui->listView->setEditTriggers(QAbstractItemView::EditTrigger::NoEditTriggers);
    }
}

void Widget::on_pushButton_3_clicked()
{
    qDebug() << "行数" << m_model->rowCount();
    m_model->insertRow(m_model->rowCount()); //插入了行
    qDebug() << "插入后,行数" << m_model->rowCount();

    QModelIndex index = m_model->index(m_model->rowCount() - 1);

    m_model->setData(index, "new item", Qt::DisplayRole);

    ui->listView->setCurrentIndex(index);
}

void Widget::on_pushButton_4_clicked()
{
    QModelIndex index = ui->listView->currentIndex();
    m_model->insertRow(index.row()); //可以插入行
    //    m_model->insertRows(index.row(), 0); //会把行给换掉

    m_model->setData(index, "insert item", Qt::DisplayRole);
}

void Widget::on_pushButton_5_clicked()
{
    QModelIndex index;
    int curRow = ui->listView->currentIndex().row();
    m_model->moveRow(index, curRow, index, curRow - 1);
}

void Widget::on_pushButton_6_clicked()
{
    QModelIndex index;
    int curRow = ui->listView->currentIndex().row();
    m_model->moveRow(index, curRow, index, curRow + 2); //下移需要加2 ,因为两个行号的号,程序会进行自动调整
}

void Widget::on_pushButton_8_clicked(bool checked)
{
    if (checked) {
        m_model->sort(0, Qt::SortOrder::AscendingOrder); //升序
    } else {
        m_model->sort(0, Qt::SortOrder::DescendingOrder); //降序
    }
}

void Widget::on_pushButton_9_clicked()
{
    ui->plainTextEdit->clear();
}

void Widget::on_pushButton_10_clicked()
{
    ui->plainTextEdit->clear();
    QStringList tempList = m_model->stringList();
    for (int i = 0; i < tempList.count(); i++) {
        ui->plainTextEdit->appendPlainText(tempList.at(i));
    }
}

void Widget::on_listView_clicked(const QModelIndex& index)
{
    QString str = QString::asprintf("模型索引: row %d,column = %d", index.row(), index.column());
    qDebug() << str;
    qDebug() << m_model->data(index, Qt::DisplayRole);
}

 ui_widget.h

/********************************************************************************
** Form generated from reading UI file 'widget.ui'
**
** Created by: Qt User Interface Compiler version 6.3.1
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_WIDGET_H
#define UI_WIDGET_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QGroupBox>
#include <QtWidgets/QListView>
#include <QtWidgets/QPlainTextEdit>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QSplitter>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_Widget
{
public:
    QVBoxLayout *verticalLayout_2;
    QSplitter *splitter;
    QGroupBox *groupBox;
    QGridLayout *gridLayout;
    QCheckBox *checkBox;
    QPushButton *pushButton_4;
    QPushButton *pushButton_3;
    QListView *listView;
    QPushButton *pushButton;
    QPushButton *pushButton_5;
    QPushButton *pushButton_2;
    QPushButton *pushButton_8;
    QPushButton *pushButton_7;
    QPushButton *pushButton_6;
    QGroupBox *groupBox_2;
    QVBoxLayout *verticalLayout;
    QPushButton *pushButton_9;
    QPushButton *pushButton_10;
    QPlainTextEdit *plainTextEdit;

    void setupUi(QWidget *Widget)
    {
        if (Widget->objectName().isEmpty())
            Widget->setObjectName(QString::fromUtf8("Widget"));
        Widget->resize(800, 600);
        verticalLayout_2 = new QVBoxLayout(Widget);
        verticalLayout_2->setObjectName(QString::fromUtf8("verticalLayout_2"));
        splitter = new QSplitter(Widget);
        splitter->setObjectName(QString::fromUtf8("splitter"));
        splitter->setOrientation(Qt::Horizontal);
        groupBox = new QGroupBox(splitter);
        groupBox->setObjectName(QString::fromUtf8("groupBox"));
        gridLayout = new QGridLayout(groupBox);
        gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
        checkBox = new QCheckBox(groupBox);
        checkBox->setObjectName(QString::fromUtf8("checkBox"));
        checkBox->setChecked(true);
        checkBox->setTristate(false);

        gridLayout->addWidget(checkBox, 0, 2, 1, 1);

        pushButton_4 = new QPushButton(groupBox);
        pushButton_4->setObjectName(QString::fromUtf8("pushButton_4"));

        gridLayout->addWidget(pushButton_4, 1, 1, 1, 1);

        pushButton_3 = new QPushButton(groupBox);
        pushButton_3->setObjectName(QString::fromUtf8("pushButton_3"));

        gridLayout->addWidget(pushButton_3, 1, 0, 1, 1);

        listView = new QListView(groupBox);
        listView->setObjectName(QString::fromUtf8("listView"));

        gridLayout->addWidget(listView, 3, 0, 1, 3);

        pushButton = new QPushButton(groupBox);
        pushButton->setObjectName(QString::fromUtf8("pushButton"));

        gridLayout->addWidget(pushButton, 0, 0, 1, 1);

        pushButton_5 = new QPushButton(groupBox);
        pushButton_5->setObjectName(QString::fromUtf8("pushButton_5"));

        gridLayout->addWidget(pushButton_5, 2, 0, 1, 1);

        pushButton_2 = new QPushButton(groupBox);
        pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));

        gridLayout->addWidget(pushButton_2, 0, 1, 1, 1);

        pushButton_8 = new QPushButton(groupBox);
        pushButton_8->setObjectName(QString::fromUtf8("pushButton_8"));
        pushButton_8->setCheckable(true);
        pushButton_8->setChecked(false);

        gridLayout->addWidget(pushButton_8, 2, 2, 1, 1);

        pushButton_7 = new QPushButton(groupBox);
        pushButton_7->setObjectName(QString::fromUtf8("pushButton_7"));

        gridLayout->addWidget(pushButton_7, 1, 2, 1, 1);

        pushButton_6 = new QPushButton(groupBox);
        pushButton_6->setObjectName(QString::fromUtf8("pushButton_6"));

        gridLayout->addWidget(pushButton_6, 2, 1, 1, 1);

        splitter->addWidget(groupBox);
        groupBox_2 = new QGroupBox(splitter);
        groupBox_2->setObjectName(QString::fromUtf8("groupBox_2"));
        verticalLayout = new QVBoxLayout(groupBox_2);
        verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
        pushButton_9 = new QPushButton(groupBox_2);
        pushButton_9->setObjectName(QString::fromUtf8("pushButton_9"));

        verticalLayout->addWidget(pushButton_9);

        pushButton_10 = new QPushButton(groupBox_2);
        pushButton_10->setObjectName(QString::fromUtf8("pushButton_10"));

        verticalLayout->addWidget(pushButton_10);

        plainTextEdit = new QPlainTextEdit(groupBox_2);
        plainTextEdit->setObjectName(QString::fromUtf8("plainTextEdit"));

        verticalLayout->addWidget(plainTextEdit);

        splitter->addWidget(groupBox_2);

        verticalLayout_2->addWidget(splitter);


        retranslateUi(Widget);

        QMetaObject::connectSlotsByName(Widget);
    } // setupUi

    void retranslateUi(QWidget *Widget)
    {
        Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));
        groupBox->setTitle(QCoreApplication::translate("Widget", "1", nullptr));
        checkBox->setText(QCoreApplication::translate("Widget", "\345\205\201\350\256\270\347\274\226\350\276\221", nullptr));
        pushButton_4->setText(QCoreApplication::translate("Widget", "\346\217\222\345\205\245\351\241\271", nullptr));
        pushButton_3->setText(QCoreApplication::translate("Widget", "\346\267\273\345\212\240\351\241\271", nullptr));
        pushButton->setText(QCoreApplication::translate("Widget", "\346\201\242\345\244\215\345\210\227\350\241\250", nullptr));
        pushButton_5->setText(QCoreApplication::translate("Widget", "\344\270\212\347\247\273", nullptr));
        pushButton_2->setText(QCoreApplication::translate("Widget", "\346\270\205\351\231\244\345\210\227\350\241\250", nullptr));
        pushButton_8->setText(QCoreApplication::translate("Widget", "\346\216\222\345\272\217", nullptr));
        pushButton_7->setText(QCoreApplication::translate("Widget", "\345\210\240\351\231\244\351\241\271", nullptr));
        pushButton_6->setText(QCoreApplication::translate("Widget", "\344\270\213\347\247\273", nullptr));
        groupBox_2->setTitle(QCoreApplication::translate("Widget", "2", nullptr));
        pushButton_9->setText(QCoreApplication::translate("Widget", "\346\270\205\347\251\272\346\226\207\346\234\254", nullptr));
        pushButton_10->setText(QCoreApplication::translate("Widget", "\346\230\276\347\244\272\346\225\260\346\215\256\346\250\241\345\236\213", nullptr));
    } // retranslateUi

};

namespace Ui {
    class Widget: public Ui_Widget {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_WIDGET_H

QTableview和QStandItemModel

UI界面

 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QFileDialog>
#include <QItemSelectionModel>
#include <QRegularExpression>
#include <QStringList>
MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    labCurFile = new QLabel("当前文件", this);
    labCurFile->setMinimumWidth(200);
    labCellPos = new QLabel("当前单元格", this);
    labCellPos->setMinimumWidth(200);

    labCellText = new QLabel("单元格内容", this);
    labCellText->setMinimumWidth(200);

    ui->statusbar->addWidget(labCurFile);
    ui->statusbar->addWidget(labCellPos);
    ui->statusbar->addWidget(labCellText);

    m_model = new QStandardItemModel(2, FixedColumnCount, this);

    m_selection = new QItemSelectionModel(m_model, this);
    ui->tableView->setModel(m_model); //设置模型
    ui->tableView->setSelectionModel(m_selection); //设置选择的模型
    ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection); //设置选择的方式
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems); //设置选择行为
    connect(m_selection, &QItemSelectionModel::currentChanged, this, &MainWindow::do_currentChanged);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initModelData(QStringList& list)
{
    int rowCount = list.size();
    qDebug() << "行数" << rowCount;
    m_model->setRowCount(rowCount - 1); //设置行数减一
    QString header = list.at(0);
    //通过正则表达式将数据分开
    QStringList headList = header.split(QRegularExpression(R"(\s+)"), Qt::SkipEmptyParts); // \s+匹配空字符
    m_model->setHorizontalHeaderLabels(headList);
    qDebug() << headList;
    QStandardItem* item;
    int j;
    for (int i = 1; i < rowCount; i++) {
        QString alineText = list.at(i);
        QStringList tempList = header.split(QRegularExpression(R"(\s+)"), Qt::SkipEmptyParts); // \s+匹配空字符
        for (j = 0; j < FixedColumnCount - 1; j++) {
            item = new QStandardItem(headList.at(j));
            m_model->setItem(i - 1, j, item);
        }
        item = new QStandardItem(list.at(j));
        item->setCheckable(true);
        item->setBackground(QBrush(Qt::yellow));
        if (tempList.at(j) == "0") {
            item->setCheckState(Qt::CheckState::Unchecked);
        } else {
            item->setCheckState(Qt::CheckState::Checked);
        }
    }
}

void MainWindow::do_currentChanged(const QModelIndex& current, const QModelIndex& previous)
{
    Q_UNUSED(previous); //消除没有使用过的警告
    //当前改变触发
    qDebug() << "改变:" << previous.row() << previous.column(); //上次的位置
    if (current.isValid()) {
        labCellPos->setText(QString::fromStdString("当前单元格:%1行,%2列").arg(current.row()).arg(current.column()));
        QStandardItem* item = m_model->itemFromIndex(current);
        labCellText->setText("单元格内容: " + item->text());
        ui->pushButton_9->setChecked(item->font().bold());
    }
}

void MainWindow::on_pushButton_clicked()
{
    QString curPath = QCoreApplication::applicationDirPath(); //获取当前应用程序的路径
    QString fileName = QFileDialog::getOpenFileName(this, "打开文件", "./", "数据文件(*.txt);;所有文件(*.*)");

    if (fileName.isEmpty())
        return;
    //不为空
    qDebug() << fileName;
    QFile f = QFile(fileName);
    if (!f.open(QIODevice::ReadOnly | QIODevice::Text))
        return;
    QStringList list;
    ui->plainTextEdit->clear();
    QTextStream astream(&f); //设置文件数据流,传入的是文本流
    while (!astream.atEnd()) {
        QString str = astream.readLine();
        ui->plainTextEdit->appendPlainText(str);
        list.append(str);
    }
    f.close();

    //    qDebug() << "加载完成" << list;
    labCurFile->setText("当前文件:" + fileName);
    ui->btn_add->setEnabled(true);
    ui->btn_insert->setEnabled(true);
    ui->btn_remove->setEnabled(true);
    initModelData(list);
}

void MainWindow::on_pushButton_2_clicked()
{
    ui->plainTextEdit->clear();
    //处理表头
    QStandardItem* aitem;
    QString str;
    for (int i = 0; i < m_model->columnCount(); ++i) {
        aitem = m_model->horizontalHeaderItem(i);
        str += aitem->text();
        str += '\t';
    }
    ui->plainTextEdit->appendPlainText(str);

    //处理内容
}

void MainWindow::on_btn_add_clicked()
{
    QList<QStandardItem*> list;
    QStandardItem* aitem;
    for (int i = 0; i < m_model->columnCount() - 1; ++i) {
        aitem = new QStandardItem("0");
        list << aitem;
    }
    QString str = m_model->headerData(m_model->columnCount() - 1, Qt::Horizontal).toString();
    aitem = new QStandardItem(str);
    aitem->setCheckable(true);
    aitem->setBackground(QBrush(Qt::yellow));

    list << aitem;
    m_model->insertRow(m_model->rowCount(), list);

    m_selection->clearSelection();
    m_selection->setCurrentIndex(m_model->index(m_model->rowCount() - 1, 0), QItemSelectionModel::Select); //选中
}

void MainWindow::on_btn_insert_clicked()
{
    QList<QStandardItem*> list;
    QModelIndex index;
    QStandardItem* aitem;
    for (int i = 0; i < m_model->columnCount() - 1; ++i) {
        aitem = new QStandardItem("1");
        list << aitem;
    }
    QString str = m_model->headerData(m_model->columnCount() - 1, Qt::Horizontal).toString();
    aitem = new QStandardItem(str);
    aitem->setCheckable(true);
    aitem->setBackground(QBrush(Qt::yellow));

    list << aitem;
    index = m_selection->currentIndex();
    m_model->insertRow(index.row(), list);

    m_selection->clearSelection();
    m_selection->setCurrentIndex(index, QItemSelectionModel::Select); //选中
}

void MainWindow::on_btn_remove_clicked()
{
    QModelIndex index = m_selection->currentIndex();
    //    m_model->setRowCount(m_model->rowCount());
    qDebug() << "当前行" << index.row();
    qDebug() << "行总数" << m_model->rowCount() - 1;

    if (index.row() != m_model->rowCount() - 1) {
        m_model->removeRow(index.row());

        m_selection->setCurrentIndex(index, QItemSelectionModel::Select);
    } else {
        m_model->removeRow(index.row());
    }
}

void MainWindow::on_pushButton_6_clicked()
{
    if (!m_selection->hasSelection())
        return;
    QModelIndexList indexList = m_selection->selectedIndexes();
    for (auto index : indexList) {
        m_model->itemFromIndex(index)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
    }
}

void MainWindow::on_pushButton_8_clicked()
{
    if (!m_selection->hasSelection())
        return;
    QModelIndexList indexList = m_selection->selectedIndexes();
    for (auto index : indexList) {
        m_model->itemFromIndex(index)->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
    }
}

void MainWindow::on_pushButton_7_clicked()
{
    if (!m_selection->hasSelection())
        return;
    QModelIndexList indexList = m_selection->selectedIndexes();
    for (auto index : indexList) {
        m_model->itemFromIndex(index)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
    }
}

void MainWindow::on_pushButton_9_clicked(bool checked)
{
    if (!m_selection->hasSelection())
        return;
    QModelIndexList indexList = m_selection->selectedIndexes();
    for (auto index : indexList) {
        //        QFont font = m_model->itemFromIndex(index)->font();
        //        font.setBold(checked);
        //        m_model->itemFromIndex(index)->setFont(font);
        QFont f;
        f.setBold(checked);
        m_model->itemFromIndex(index)->setFont(f);
    }
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QItemSelectionModel>
#include <QLabel>
#include <QMainWindow>
#include <QModelIndex>
#include <QStandardItem>
#include <QStandardItemModel>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow {
    Q_OBJECT

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

private:
    Ui::MainWindow* ui;
    QLabel* labCurFile;
    QLabel* labCellPos;
    QLabel* labCellText;
    const int FixedColumnCount = 6;
    QStandardItemModel* m_model;
    QItemSelectionModel* m_selection;
    void initModelData(QStringList& lsit);
private slots:
    void do_currentChanged(const QModelIndex& current, const QModelIndex& previous);
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
    void on_btn_add_clicked();
    void on_btn_insert_clicked();
    void on_btn_remove_clicked();
    void on_pushButton_6_clicked();
    void on_pushButton_8_clicked();
    void on_pushButton_7_clicked();
    void on_pushButton_9_clicked(bool checked);
};
#endif // MAINWINDOW_H

QFileSystemModel模型

UI界面

 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QListView>
#include <QTableView>
#include <QTreeView>
MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    model = new QFileSystemModel(this);
    ui->treeView->setModel(model);
    ui->listView->setModel(model);
    ui->tableView->setModel(model);
    model->setRootPath("./"); //需要设置结构目录 并不会改他自己的结构 QDir::currentPath() 不可以没有这行,作用是激活
    ui->treeView->setRootIndex(model->index(QDir::currentPath())); //需要这样设置才会改变真正的位置
    connect(ui->treeView, &QTreeView::clicked, ui->listView, &QListView::setRootIndex); //树结构点击,设置数结构点
    connect(ui->treeView, &QTreeView::clicked, ui->tableView, &QTableView::setRootIndex);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_action_root_triggered()
{
    //设置根目录
    QString dir = QFileDialog::getExistingDirectory(this, "获取目录", "./");
    qDebug() << dir;
    if (dir.isEmpty())
        return;

    ui->listView->setRootIndex(model->index(dir)); //设置目录
    ui->tableView->setRootIndex(model->index(dir));
    ui->treeView->setRootIndex(model->index(dir));
}

void MainWindow::on_radioButton_clicked()
{
    //显示目录和文件
    model->setFilter(QDir::Filter::Files | QDir::Filter::AllDirs | QDir::NoDotAndDotDot);
    ui->frame_2->setEnabled(true);
}

void MainWindow::on_radioButton_2_clicked()
{
    //只显示目录
    model->setFilter(QDir::Filter::AllDirs | QDir::NoDotAndDotDot);
    ui->frame_2->setEnabled(false);
}

void MainWindow::on_checkBox_clicked(bool checked)
{

    ui->comboBox_1->setEnabled(checked);
    ui->pushButton->setEnabled(checked);
    model->setNameFilterDisables(!checked);
}

void MainWindow::on_pushButton_clicked()
{
    QStringList strlist = ui->comboBox_1->currentText().trimmed().split(";", Qt::SkipEmptyParts); //去掉两边空格,在按照;进行分割,不要空字符
    qDebug() << strlist;
    model->setNameFilters(strlist);
}

void MainWindow::on_treeView_clicked(const QModelIndex& index)
{
    ui->label_file->setText(model->fileName(index));
    ui->label_path->setText(model->filePath(index));
    ui->label_type->setText(model->type(index));
    ui->checkBox_check->setChecked(model->isDir(index));
    int sz = model->size(index);
    if (sz < 1024) {
        ui->label_size->setText(QString("%1 KB").arg(sz));

    } else {
        //        ui->label_size->setText(QString("%1 mb").arg(sz / 1024.0)); //不能设置小数点位数显示
        ui->label_size->setText(QString::asprintf("%.1f mb", sz / 1024.0)); //可以设置打印自定义格式
    }
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QFileSystemModel>
#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow {
    Q_OBJECT

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

private slots:
    void on_action_root_triggered();

    void on_radioButton_clicked();

    void on_radioButton_2_clicked();

    void on_checkBox_clicked(bool checked);

    void on_pushButton_clicked();

    void on_treeView_clicked(const QModelIndex& index);

private:
    Ui::MainWindow* ui;
    QFileSystemModel* model;
};
#endif // MAINWINDOW_H

总结

一般来说,设置视图模型的对应关系时,会给QTableView设置两个模型,一个是

QStandardItemModel 用于设置一些基本的数据信息,另一个是选择的模型
QItemSelectionModel 用于判断选中单元格的具体位置,几行几列,根据这个模型可以获取到数据。

定制窗口

ui文件

 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "tdialoglocate.h"

#include "tdialogheader.h"
#include "tdialogsize.h"
#include <QItemSelectionModel>
#include <QLabel>
#include <QMainWindow>
#include <QStandardItemModel>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow {
    Q_OBJECT

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

private slots:
    void on_action_row_column_triggered();

    void on_action_title_triggered();

    void on_action_cell_triggered();
    void do_setCellText(int row, int col, QString& text);

    void on_tableView_clicked(const QModelIndex& index);
    void do_model_currentchanged(QModelIndex current, QModelIndex previous);

signals:
    void cellIndexChanged(int row, int column);

private:
    Ui::MainWindow* ui;
    TDialogSize* tdialogsize;
    QStandardItemModel* m_model;
    QItemSelectionModel* m_selection;
    TDialogHeader* tdialogheader = nullptr;
    TDialogLocate* tdialoglocate;
    QLabel* labelcellpos;
    QLabel* labeltext;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QItemSelectionModel>
MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_model = new QStandardItemModel(4, 4, this);
    QStringList headers;
    headers << "姓名"
            << "性别"
            << "学号"
            << "部门";
    m_model->setHorizontalHeaderLabels(headers);
    m_selection = new QItemSelectionModel(m_model);

    ui->tableView->setModel(m_model);
    ui->tableView->setSelectionModel(m_selection);

    this->setCentralWidget(ui->tableView);
    labelcellpos = new QLabel("当前单元格:", this);
    labelcellpos->setMinimumWidth(200);
    labeltext = new QLabel("当前文本:", this);
    labeltext->setMinimumWidth(200);
    ui->statusbar->addWidget(labelcellpos);
    ui->statusbar->addWidget(labeltext);
    connect(m_selection, &QItemSelectionModel::currentChanged, this, &MainWindow::do_model_currentchanged);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_action_row_column_triggered()
{
    tdialogsize = new TDialogSize(this);
    tdialogsize->setWindowFlag(Qt::MSWindowsFixedSizeDialogHint); //设置固定的大小

    tdialogsize->setRowColumn(m_model->rowCount(), m_model->columnCount());
    int ret = tdialogsize->exec(); // 1是接收 0是拒绝
    if (ret == QDialog::Accepted) {
        m_model->setColumnCount(tdialogsize->columnCount());
        m_model->setRowCount(tdialogsize->rowCount());
    }

    delete tdialogsize;
}

void MainWindow::on_action_title_triggered()
{
    if (tdialogheader == nullptr) {
        tdialogheader = new TDialogHeader(this);
    }
    QStringList strlist;
    for (int i = 0; i < m_model->columnCount(); i++) {
        strlist.append(m_model->headerData(i, Qt::Orientation::Horizontal, Qt::DisplayRole).toString()); //添加头部数据,在水平
    }
    tdialogheader->setHeaderList(strlist);

    int ret = tdialogheader->exec();
    if (ret == QDialog::Accepted) {
        strlist = tdialogheader->headerList();
        m_model->setHorizontalHeaderLabels(strlist);
    }
}

void MainWindow::on_action_cell_triggered()
{
    tdialoglocate = new TDialogLocate(this);
    tdialoglocate->setAttribute(Qt::WA_DeleteOnClose, true); //关闭时,自动删除
    tdialoglocate->setWindowFlag(Qt::WindowType::WindowStaysOnTopHint); //窗口始终在上面显示
    //初始化对话框
    tdialoglocate->setSpinRange(m_model->rowCount(), m_model->columnCount());
    QModelIndex index = m_selection->currentIndex();
    if (index.isValid()) {
        qDebug() << "index = " << index.row() << " " << index.column();
        tdialoglocate->setSpinValue(index.row(), index.column());
    }
    connect(tdialoglocate, &TDialogLocate::changeCellText, this, &MainWindow::do_setCellText);
    connect(tdialoglocate, &TDialogLocate::changeActionEnable, ui->action_cell, &QAction::setEnabled);

    connect(this, &MainWindow::cellIndexChanged, tdialoglocate, &TDialogLocate::setSpinValue);

    tdialoglocate->show();
}

void MainWindow::do_setCellText(int row, int col, QString& text)
{
    QModelIndex index = m_model->index(row, col);
    m_selection->clearSelection();
    m_selection->setCurrentIndex(index, QItemSelectionModel::SelectionFlag::Select);
    m_model->setData(index, text);
}

void MainWindow::on_tableView_clicked(const QModelIndex& index)
{
    qDebug() << "点击了" << index.row() << " " << index.column();
    emit cellIndexChanged(index.row(), index.column());
}

void MainWindow::do_model_currentchanged(QModelIndex current, QModelIndex previous)
{
    if (current.isValid()) {
        labelcellpos->setText(QString::asprintf("当前单元格是:%d行 %d列", current.row(), current.column()));
    }
    QStandardItem* model = m_model->itemFromIndex(current); //根据索引取item
    labeltext->setText("单元格内容: " + model->text());
}

tdialogheader.h

#ifndef TDIALOGHEADER_H
#define TDIALOGHEADER_H

#include <QDialog>
#include <QStringList>
#include <QStringListModel>

namespace Ui {
class TDialogHeader;
}

class TDialogHeader : public QDialog {
    Q_OBJECT

public:
    explicit TDialogHeader(QWidget* parent = nullptr);
    ~TDialogHeader();
    void setHeaderList(QStringList& headers);
    QStringList headerList();

private:
    Ui::TDialogHeader* ui;
    QStringListModel* m_model;
};

#endif // TDIALOGHEADER_H

tdialogheader.cpp

#include "tdialogheader.h"
#include "ui_tdialogheader.h"

TDialogHeader::TDialogHeader(QWidget* parent)
    : QDialog(parent)
    , ui(new Ui::TDialogHeader)
{
    ui->setupUi(this);
    m_model = new QStringListModel(this);
    ui->listView->setModel(m_model);
}

TDialogHeader::~TDialogHeader()
{
    delete ui;
}

void TDialogHeader::setHeaderList(QStringList& headers)
{
    m_model->setStringList(headers); // QStringList模型设置标头
}

QStringList TDialogHeader::headerList()
{
    return m_model->stringList();
}

后续代码就不贴了,需要联系 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/51686.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

认识 springboot 并了解它的创建过程 - 1

前言 本篇介绍什么是SpringBoot, SpringBoot项目如何创建&#xff0c;认识创建SpringBoot项目的目录&#xff0c;了解SpringBoo特点如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言1.什么是springboot?2.为什么…

COMSOL三维Voronoi图泰森多边形3D模型轴压模拟及建模教程

多晶体模型采用三维Voronoi算法生成&#xff0c;试件尺寸为150150300mm棱柱模型&#xff0c;对晶格指定五种不同材料&#xff0c;实现晶格间的差异性。 对试件进行力学模拟&#xff0c;下侧为固定边界&#xff0c;限制z方向的位移&#xff0c;上表面通过给定位移的方式实现轴…

应用开发者的疑问:大模型是银弹吗?

被当成银弹的大模型 ChatGPT 火了之后&#xff0c;大模型似乎被当成了真正的银弹&#xff0c;所有的体验问题都想通过大模型解决&#xff1a; 能不能和大模型对话订机票&#xff1f;自然语言生成 SQL&#xff0c;简化报表分析工作&#xff1f;大模型帮老年人操作软件&#xff…

rpc通信原理浅析

rpc通信原理浅析 rpc(remote procedure call)&#xff0c;即远程过程调用&#xff0c;广泛用于分布式或是异构环境下的通信&#xff0c;数据格式一般采取protobuf。 protobuf&#xff08;protocol buffer&#xff09;是google 的一种数据交换的格式&#xff0c;它独立于平台语…

第2章 逻辑分页、AutoFac注入、工作单元与仓储

1 CoreCms.Net.Model.ViewModels.Basics.IPageList<T> namespace CoreCms.Net.Model.ViewModels.Basics { ///<typeparam name"T">泛型类型实例(1个指定实体的类型实例)。</typeparam> /// <summary> /// 【逻辑分页列表--接口】 /// <…

qt添加图标

1.添加资源 选择QtWidgetsApp.qrc文件打开 添加图标文件路径 添加图标文件 2.按钮添加图标 图标路径为:/res/res/swicth.jpg &#xff08;1&#xff09;代码设置图标 ui.pushButton_OPen->setIcon(QIcon(":/res/res/swicth.jpg")); &#xff08;2&#xff09;属…

MySQL数据库——DQL操作——基本查询

文章目录 前言事前准备——测试数据整表查询指定列查找别名查询MySQL运算符条件查询模糊查询排序查询聚合查询分组查询分组之后的条件筛选 分页查询将整张表的数据插入到另一张表中 前言 MySQL数据库常见的操作是增删查改&#xff0c;而其中数据的查询是使用最多&#xff0c;也…

WormGPT – 网络犯罪分子用来犯罪的人工智能工具

WormGPT – 网络犯罪分子用来发起商业电子邮件泄露攻击的生成式人工智能工具 前言 什么是蠕虫GPT&#xff08;WormGPT&#xff09; WormGPT是基于EleutherAI于2021年创建的大型语言模型GPT-J的AI模型。它具有无限的字符支持、聊天记忆保留和代码格式化功能。 如果未部署适当…

行为型:发布订阅模式

定义   发布订阅模式是基于一个事件&#xff08;主题&#xff09;通道&#xff0c;希望接收通知的对象Subscriber&#xff08;订阅者&#xff09;通过自定义事件订阅主题&#xff0c;被激活事件的对象 Publisher &#xff08;发布者&#xff09;通过发布主题事件的方式通知订…

AI 绘画Stable Diffusion 研究(二)sd模型ControlNet1.1 介绍与安装

部署包作者:秋葉aaaki 免责声明: 本安装包及启动器免费提供 无任何盈利目的 大家好&#xff0c;我是风雨无阻。 众所周知&#xff0c;StableDiffusion 是非常强大的AI绘图工具&#xff0c;需要详细了解StableDiffusion的朋友&#xff0c;可查看我之前的这篇文章&#xff1a; …

深度学习实践——模型部署优化实践

系列实验 深度学习实践——卷积神经网络实践&#xff1a;裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 源码&#xff1a; 1. 对应的github地址 https://github.com/Asionm/streamlit_demo 2. 对应的gitee地…

fwrite函数

1、函数声明 size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); 2、参数说明 buffer 指向要写入的数据的指针。 size 项大小&#xff08;以字节为单位&#xff09;。 count 要写入的项的最大数量。 stream 指向 FILE 结构的指针。 3、…

【机器学习】Cost Function

Cost Function 1、计算 cost2、cost 函数的直观理解3、cost 可视化总结附录 首先&#xff0c;导入所需的库&#xff1a; import numpy as np %matplotlib widget import matplotlib.pyplot as plt from lab_utils_uni import plt_intuition, plt_stationary, plt_update_onclic…

C# VS2022+WinForm+Oracle19.3+存储过程,SQL和代码分离

【我的目的】&#xff1a;SQL和代码分别存放在不同的地方&#xff0c;便于随时修改SQL的内容&#xff0c;也便于修改SQL的书写格式 方案1&#xff1a;把SQL存放在DataSet.xsd中实现SQL和代码分离 方案2&#xff1a;用存储过程实现SQL和代码分离 我最倾向方案1&#xff0c;利用…

网络安全(黑客)自学误区

前言 网络安全是当今社会中至关重要的议题。随着科技的迅猛发展&#xff0c;网络已经渗透到我们生活的方方面面&#xff0c;给我们带来了巨大的便利和机遇。然而&#xff0c;网络也存在着各种风险和威胁&#xff0c;如黑客攻击、数据泄露等。因此&#xff0c;学习网络安全知识…

给你一个项目,你将如何开展性能测试工作?

一、性能三连问 1、何时进行性能测试&#xff1f; 性能测试的工作是基于系统功能已经完备或者已经趋于完备之上的&#xff0c;在功能还不够完备的情况下没有多大的意义。因为后期功能完善上会对系统的性能有影响&#xff0c;过早进入性能测试会出现测试结果不准确、浪费测试资…

一文学会redis在springBoot中的使用

“收藏从未停止&#xff0c;练习从未开始”&#xff0c;或许有那么一些好题好方法&#xff0c;在被你选中收藏后却遗忘在收藏夹里积起了灰&#xff1f;今天请务必打开你沉甸甸的收藏重新回顾&#xff0c;分享一下那些曾让你拍案叫绝的好东西吧&#xff01; 一、什么是redis缓存…

万年历【小游戏】(Java课设)

系统类型 Java实现的小游戏 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Idea或eclipse 运行效果 更多Java课设系统源码地址&#xff1a;更多Java课设系统源码地址 更多Java小游戏运行效果展示&#xff1a;更多Java小游戏运行效果展…

JavaScript学习 -- 对称加密算法DES

在现代的互联网时代&#xff0c;数据安全性备受关注。为了保护敏感数据的机密性&#xff0c;对称加密算法是一种常用的方法。在JavaScript中&#xff0c;DES&#xff08;Data Encryption Standard&#xff09;是一种常用的对称加密算法。本篇博客将为您展示如何在JavaScript中使…

Unity 四元素

//-------------旋转------------ // //设置角度 (超过90或负数时&#xff0c;会设置-1结果是359这样的问题&#xff0c;可以使用下面旋转的方式) transform.rotate new Quaternion(0,0,0,0);//Quaternion四元数 transform.localEulerAngles new Vector3(0,0,0);//EulerA…