Use QTableWidget para realizar la operación de programación de video

1. Introducción

    El programa de grabación se realiza utilizando la clase ScheduleTableWidget heredada de QTableWidget. En la clase de implementación ScheduleTableWidget, los encabezados horizontales y verticales originales de la tabla se eliminan y la primera fila y la primera columna se usan para formar un nuevo encabezado, respectivamente. El nuevo encabezado horizontal representa las 24 horas del día y el nuevo encabezado vertical representa la semana. El nuevo encabezado horizontal son dos celdas fusionadas con setSpan, por lo que cada celda debajo representa media hora. Tanto el encabezado horizontal como el encabezado vertical introducen delegados personalizados para implementar configuraciones como fuentes y colores. Se pueden dibujar varias áreas seleccionadas manteniendo presionado Ctrl+botón izquierdo del mouse. En QtCreator, el efecto de la operación de programación de video se muestra en la siguiente figura:

inserte la descripción de la imagen aquí

2. Interfaces relacionadas

    La interfaz de programación de grabación se realiza configurando si la celda está seleccionada o no con una cadena de 0 y 1, un total de 7*48=336 caracteres.

2.1 Seleccionar todas las operaciones

inserte la descripción de la imagen aquí

void MainWindow::on_pushButton_allSelect_clicked()
{
    QString strItem = QString("111111111111111111111111111111111111111111111111"
                              "111111111111111111111111111111111111111111111111"
                              "111111111111111111111111111111111111111111111111"
                              "111111111111111111111111111111111111111111111111"
                              "111111111111111111111111111111111111111111111111"
                              "111111111111111111111111111111111111111111111111"
                              "111111111111111111111111111111111111111111111111");
    ui->tableWidget->setItemSelectByString(strItem);
}

2.2 Borrar todo

inserte la descripción de la imagen aquí

void MainWindow::on_pushButton_allClear_clicked()
{
    QString strItem = QString("000000000000000000000000000000000000000000000000"
                              "000000000000000000000000000000000000000000000000"
                              "000000000000000000000000000000000000000000000000"
                              "000000000000000000000000000000000000000000000000"
                              "000000000000000000000000000000000000000000000000"
                              "000000000000000000000000000000000000000000000000"
                              "000000000000000000000000000000000000000000000000");
    ui->tableWidget->setItemSelectByString(strItem);
}

2.3 Establecido por cadena específica

inserte la descripción de la imagen aquí

void MainWindow::on_pushButton_Set_clicked()
{
    QString strItem = QString("111111000000000000000000000000000000000000000000"
                              "111111000000000000000000000000000000000000000000"
                              "111111000000000000000000000000000000000000000000"
                              "111111000000000000000000000000000000000000000000"
                              "111111000000000000000000000000000000000000000000"
                              "111111000000000000000000000000000000000000000000"
                              "111111000000000000000000000000000000000000000000");
    ui->tableWidget->setItemSelectByString(strItem);
}

2.4 Obtener cadena de configuración de programación

inserte la descripción de la imagen aquí

void MainWindow::on_pushButton_get_clicked()
{
    QString strItem;
    ui->tableWidget->getItemSelectByString(strItem);
    MY_DEBUG << "strItem:" << strItem;

    QMessageBox::information(this, "mySchedule", strItem);
}

3. Código central

widgettabletable.h

#ifndef SCHEDULETABLEWIDGET_H
#define SCHEDULETABLEWIDGET_H

#include <QObject>
#include <QTableWidget>
#include <QVector>
#include <QDebug>
#include <QMessageBox>

#define ROW_HEIGHT 20
#define COLUMN_WIDTH 20

#define MAX_ITEM_COUNT 336
#define ROW_COUNT 8
#define COLUMN_COUNT 49


#define  MY_DEBUG  qDebug() << "[" << __FILE__ << ":" << __FUNCTION__ << ":" << __LINE__ << "] "

typedef struct SCHEDULE_POSITION
{
    int nRow;
    int nColumn;
}SCHEDULE_POSITION_T;


class ScheduleTableWidget : public QTableWidget
{
public:
    ScheduleTableWidget(QWidget *parent = Q_NULLPTR);
    ~ScheduleTableWidget(){}

    void initSchedule();

    void getItemSelectByString(QString& sItemValue);
    void setItemSelectByString(QString sItemValue);

 private:
    void getItemSelectByPos(QVector<SCHEDULE_POSITION_T>& vecSelectedItems);
    void setItemSelectByPos(QVector<SCHEDULE_POSITION_T> vecSelectedItems);

public:
    QVector<SCHEDULE_POSITION_T> m_vecSelectedItems;

};

#endif // SCHEDULETABLEWIDGET_H

widgetdetabladeprogramación.cpp


void ScheduleTableWidget::initSchedule()
{
	//表格设置
    //....

    //用首列和首行来作为新表头
    this->setSpan(0,1,1,2);
    this->setSpan(0,3,1,2);
    this->setSpan(0,5,1,2);
    this->setSpan(0,7,1,2);
    this->setSpan(0,9,1,2);
    this->setSpan(0,11,1,2);
    this->setSpan(0,13,1,2);
    this->setSpan(0,15,1,2);
    this->setSpan(0,17,1,2);
    this->setSpan(0,19,1,2);
    this->setSpan(0,21,1,2);
    this->setSpan(0,23,1,2);
    this->setSpan(0,25,1,2);
    this->setSpan(0,27,1,2);
    this->setSpan(0,29,1,2);
    this->setSpan(0,31,1,2);
    this->setSpan(0,33,1,2);
    this->setSpan(0,35,1,2);
    this->setSpan(0,37,1,2);
    this->setSpan(0,39,1,2);
    this->setSpan(0,41,1,2);
    this->setSpan(0,43,1,2);
    this->setSpan(0,45,1,2);
    this->setSpan(0,47,1,2);

    this->setItem(0, 0, new QTableWidgetItem("(Week/Hour)"));
    this->setItem(0, 1, new QTableWidgetItem("0"));
    this->setItem(0, 3, new QTableWidgetItem("1"));
    this->setItem(0, 5, new QTableWidgetItem("2"));
    this->setItem(0, 7, new QTableWidgetItem("3"));
    this->setItem(0, 9, new QTableWidgetItem("4"));
    this->setItem(0, 11, new QTableWidgetItem("5"));
    this->setItem(0, 13, new QTableWidgetItem("6"));
    this->setItem(0, 15, new QTableWidgetItem("7"));
    this->setItem(0, 17, new QTableWidgetItem("8"));
    this->setItem(0, 19, new QTableWidgetItem("9"));
    this->setItem(0, 21, new QTableWidgetItem("10"));
    this->setItem(0, 23, new QTableWidgetItem("11"));
    this->setItem(0, 25, new QTableWidgetItem("12"));
    this->setItem(0, 27, new QTableWidgetItem("13"));
    this->setItem(0, 29, new QTableWidgetItem("14"));
    this->setItem(0, 31, new QTableWidgetItem("15"));
    this->setItem(0, 33, new QTableWidgetItem("16"));
    this->setItem(0, 35, new QTableWidgetItem("17"));
    this->setItem(0, 37, new QTableWidgetItem("18"));
    this->setItem(0, 39, new QTableWidgetItem("19"));
    this->setItem(0, 41, new QTableWidgetItem("20"));
    this->setItem(0, 43, new QTableWidgetItem("21"));
    this->setItem(0, 45, new QTableWidgetItem("22"));
    this->setItem(0, 47, new QTableWidgetItem("23"));

    this->setItem(1, 0, new QTableWidgetItem("Monday"));
    this->setItem(2, 0, new QTableWidgetItem("Tuesday"));
    this->setItem(3, 0, new QTableWidgetItem("Wednesday"));
    this->setItem(4, 0, new QTableWidgetItem("Thursday"));
    this->setItem(5, 0, new QTableWidgetItem("Friday"));
    this->setItem(6, 0, new QTableWidgetItem("Saturday"));
    this->setItem(7, 0, new QTableWidgetItem("Sunday"));
}

void ScheduleTableWidget::getItemSelectByString(QString &sItemValue)
{
    QVector<SCHEDULE_POSITION_T> vecSelectedItems;
    getItemSelectByPos(vecSelectedItems);

    QByteArray arr;
    for(int i = 0; i < MAX_ITEM_COUNT; i++)
    {
        arr[i] = '0';
    }

    int nArrIndex = 0;
    for(int i = 0; i < vecSelectedItems.size(); i++)
    {
        nArrIndex = (vecSelectedItems[i].nRow-1)*(COLUMN_COUNT-1) + (vecSelectedItems[i].nColumn-1);
        arr[nArrIndex] = '1';
    }

    sItemValue = arr;
}

void ScheduleTableWidget::setItemSelectByString(QString sItemValue)
{
    MY_DEBUG << "sItemValue.count():" << sItemValue.count();
    if(sItemValue.count() < MAX_ITEM_COUNT)
    {
        QMessageBox::critical(this, "mySchedule", tr("error:Bytes less than 336"));
        return;
    }

    QByteArray arr = sItemValue.toLatin1();
    QVector<SCHEDULE_POSITION_T> vecSelectedItems;

    for(int i = 0; i < MAX_ITEM_COUNT; i++)
    {
        if(arr[i] == '1')
        {
            SCHEDULE_POSITION_T stPos;
            stPos.nRow = i/(COLUMN_COUNT-1) + 1;
            stPos.nColumn = i%(COLUMN_COUNT-1) + 1;
            MY_DEBUG << "setItemSelectByString i"  << i << " nRow:" << stPos.nRow << ", nColumn:" << stPos.nColumn;
            vecSelectedItems.push_back(stPos);
        }
    }
    setItemSelectByPos(vecSelectedItems);
}

Cuatro, descarga de código fuente de demostración

Descarga del programa ejecutable (gratis): https://download.csdn.net/download/linyibin_123/88205239

Descargue el código fuente del proyecto de demostración: https://download.csdn.net/download/linyibin_123/88059521

Supongo que te gusta

Origin blog.csdn.net/linyibin_123/article/details/131787789
Recomendado
Clasificación