1. はじめに
録画スケジュールはQTableWidgetを継承したScheduleTableWidgetクラスを利用して実現します。ScheduleTableWidget 実装クラスでは、Table の元の水平ヘッダーと垂直ヘッダーが削除され、最初の行と最初の列がそれぞれ新しいヘッダーを形成するために使用されます。新しい水平ヘッダーは 1 日の 24 時間を表し、新しい垂直ヘッダーは週を表します。新しい水平ヘッダーは setSpan で結合された 2 つのセルであるため、その下の各セルは 30 分を表します。水平ヘッダーと垂直ヘッダーの両方に、フォントや色などの設定を実装するためのカスタム デリゲートが導入されています。Ctrl キーを押しながらマウスの左ボタンを押すと、複数の選択領域を描画できます。QtCreator でのビデオ スケジュール操作の効果を次の図に示します。
2. 関連インターフェース
録画スケジュールのインターフェースは、セルが選択されているかどうかを0と1の合計7*48=336文字の文字列で設定することで実現されます。
2.1 すべての操作を選択する
void MainWindow::on_pushButton_allSelect_clicked()
{
QString strItem = QString("111111111111111111111111111111111111111111111111"
"111111111111111111111111111111111111111111111111"
"111111111111111111111111111111111111111111111111"
"111111111111111111111111111111111111111111111111"
"111111111111111111111111111111111111111111111111"
"111111111111111111111111111111111111111111111111"
"111111111111111111111111111111111111111111111111");
ui->tableWidget->setItemSelectByString(strItem);
}
2.2 すべてクリア
void MainWindow::on_pushButton_allClear_clicked()
{
QString strItem = QString("000000000000000000000000000000000000000000000000"
"000000000000000000000000000000000000000000000000"
"000000000000000000000000000000000000000000000000"
"000000000000000000000000000000000000000000000000"
"000000000000000000000000000000000000000000000000"
"000000000000000000000000000000000000000000000000"
"000000000000000000000000000000000000000000000000");
ui->tableWidget->setItemSelectByString(strItem);
}
2.3 特定の文字列で設定する
void MainWindow::on_pushButton_Set_clicked()
{
QString strItem = QString("111111000000000000000000000000000000000000000000"
"111111000000000000000000000000000000000000000000"
"111111000000000000000000000000000000000000000000"
"111111000000000000000000000000000000000000000000"
"111111000000000000000000000000000000000000000000"
"111111000000000000000000000000000000000000000000"
"111111000000000000000000000000000000000000000000");
ui->tableWidget->setItemSelectByString(strItem);
}
2.4 スケジュール設定文字列の取得
void MainWindow::on_pushButton_get_clicked()
{
QString strItem;
ui->tableWidget->getItemSelectByString(strItem);
MY_DEBUG << "strItem:" << strItem;
QMessageBox::information(this, "mySchedule", strItem);
}
3. コアコード
スケジュールテーブルウィジェット.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
スケジュールテーブルウィジェット.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);
}
4、デモソースコードのダウンロード
実行プログラムのダウンロード(無料):https://download.csdn.net/download/linyibin_123/88205239
デモ プロジェクトのソース コードをダウンロード: https://download.csdn.net/download/linyibin_123/88059521