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:
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
void MainWindow::on_pushButton_allSelect_clicked()
{
QString strItem = QString("111111111111111111111111111111111111111111111111"
"111111111111111111111111111111111111111111111111"
"111111111111111111111111111111111111111111111111"
"111111111111111111111111111111111111111111111111"
"111111111111111111111111111111111111111111111111"
"111111111111111111111111111111111111111111111111"
"111111111111111111111111111111111111111111111111");
ui->tableWidget->setItemSelectByString(strItem);
}
2.2 Borrar todo
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
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
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