mirror of
https://gitee.com/js-yhsec/energy_storage.git
synced 2026-05-28 03:09:24 +08:00
上传项目代码
This commit is contained in:
845
src/widgets/uihelper.cpp
Normal file
845
src/widgets/uihelper.cpp
Normal file
@@ -0,0 +1,845 @@
|
||||
#include "uihelper.h"
|
||||
|
||||
static QFont g_font("微软雅黑", 10);
|
||||
|
||||
std::string UiStyle::BTN =
|
||||
"QPushButton{background-color:rgba(150,150,150,80);border-radius:5px;font:bold 16px;color:white;border:2px solid gray;}"
|
||||
"QPushButton:hover{background-color:rgba(150,150,150,100);border:2px solid white;}"
|
||||
"QPushButton:pressed{border-width:3px 0 0 3px;border-style:inset;color:white;}";
|
||||
|
||||
std::shared_ptr<QLabel> QUI::label(QWidget* parent, int x, int y, int w, int h, std::string text, std::string sty)
|
||||
{
|
||||
auto lab = std::make_shared<QLabel>(parent);
|
||||
lab->setGeometry(x, y, w, h);
|
||||
lab->setText(text.c_str());
|
||||
lab->setFont(g_font);
|
||||
if (!sty.empty())
|
||||
{
|
||||
lab->setStyleSheet(sty.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
lab->setStyleSheet("QLabel {color:white;}");
|
||||
}
|
||||
return lab;
|
||||
}
|
||||
|
||||
void QUI::label(QLabel& lab, QWidget* parent, int x, int y, int w, int h, std::string text, std::string sty)
|
||||
{
|
||||
lab.setParent(parent);
|
||||
lab.setGeometry(x, y, w, h);
|
||||
lab.setText(text.c_str());
|
||||
lab.setFont(g_font);
|
||||
if (!sty.empty())
|
||||
{
|
||||
lab.setStyleSheet(sty.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
lab.setStyleSheet("QLabel {color:white;}");
|
||||
}
|
||||
}
|
||||
|
||||
void QUI::labelImage(QLabel& lab, QWidget* parent, int x, int y, int w, int h, std::string img)
|
||||
{
|
||||
lab.setParent(parent);
|
||||
lab.setGeometry(x, y, w, h);
|
||||
lab.setPixmap(QPixmap(img.c_str()));
|
||||
}
|
||||
|
||||
std::shared_ptr<LabelPairH> QUI::labelPair(QWidget* parent, int x, int y, int w, int h, int w1, std::string k, std::string v)
|
||||
{
|
||||
return std::make_shared<LabelPairH>(parent, QRect(x, y, w, h), w1, k, v);
|
||||
}
|
||||
|
||||
std::shared_ptr<LabelPairV> QUI::labelPairV(QWidget* parent, int x, int y, int w, int h, int h1, std::string k, std::string v)
|
||||
{
|
||||
auto labPair = std::make_shared<LabelPairV>(parent, QRect(x, y, w, h), h1, k, v);
|
||||
const std::string STY_VAL = "font:bold 18px;color:rgb(38,220,172);";
|
||||
labPair->setValStyle(STY_VAL);
|
||||
return labPair;
|
||||
}
|
||||
|
||||
void QUI::button(QPushButton& btn, QWidget* parent, int x, int y, int w, int h, std::string text, std::string sty)
|
||||
{
|
||||
btn.setParent(parent);
|
||||
btn.setGeometry(x, y, w, h);
|
||||
btn.setText(text.c_str());
|
||||
btn.setFont(g_font);
|
||||
if (!sty.empty())
|
||||
{
|
||||
btn.setStyleSheet(sty.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
QPushButton* QUI::button(QWidget* parent, int x, int y, int w, int h, std::string text, std::string sty/* = ""*/)
|
||||
{
|
||||
QPushButton* btn = new QPushButton(parent);
|
||||
btn->setGeometry(x, y, w, h);
|
||||
btn->setText(text.c_str());
|
||||
btn->setFont(g_font);
|
||||
if (!sty.empty())
|
||||
{
|
||||
btn->setStyleSheet(sty.c_str());
|
||||
}
|
||||
return btn;
|
||||
}
|
||||
|
||||
//std::shared_ptr<QComboBox> QUI::combox(QWidget* parent, int x, int y, int w, int h, std::vector<std::string>& items)
|
||||
//{
|
||||
// std::shared_ptr<QComboBox> comb = std::make_shared<QComboBox>(parent);
|
||||
// comb->setGeometry(x, y, w, h);
|
||||
// QStringList strlist;
|
||||
// for (auto& s: items)
|
||||
// {
|
||||
// strlist << s.c_str();
|
||||
// }
|
||||
// comb->insertItems(0, strlist);
|
||||
// return comb;
|
||||
//}
|
||||
|
||||
void QUI::combox(QComboBox& comb, QWidget* parent, int x, int y, int w, int h, std::vector<std::string> items, std::string v/* = ""*/)
|
||||
{
|
||||
comb.setParent(parent);
|
||||
comb.setGeometry(x, y, w, h);
|
||||
QStringList strlist;
|
||||
for (auto& s: items)
|
||||
{
|
||||
strlist << s.c_str();
|
||||
}
|
||||
comb.insertItems(0, strlist);
|
||||
if (!v.empty())
|
||||
{
|
||||
comb.setCurrentText(v.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void QUI::lineedit(QLineEdit& line, QWidget* parent, int x, int y, int w, int h)
|
||||
{
|
||||
line.setParent(parent);
|
||||
line.setGeometry(x, y, w, h);
|
||||
}
|
||||
|
||||
void QUI::setBackground(QWidget* w, std::string name, QColor color, std::string border)
|
||||
{
|
||||
if (!w) { return; }
|
||||
w->setObjectName(name.c_str());
|
||||
std::string sty = "#" + name + "{background-color:rgba("
|
||||
+ std::to_string(color.red())
|
||||
+ "," + std::to_string(color.green())
|
||||
+ "," + std::to_string(color.blue())
|
||||
+ "," + std::to_string(color.alpha())
|
||||
+ ");" + border + "}";
|
||||
w->setAutoFillBackground(true);
|
||||
w->setStyleSheet(sty.c_str());
|
||||
}
|
||||
|
||||
Panel::Panel(QWidget* parent, QRect rt, std::string title) : QWidget(parent)
|
||||
{
|
||||
this->setGeometry(rt);
|
||||
|
||||
// 设置背景色:方法一
|
||||
//QPalette palette(this->palette());
|
||||
//palette.setColor(QPalette::Background, QColor(29, 54, 102)); // 设置背景色
|
||||
//this->setAutoFillBackground(true);
|
||||
//this->setPalette(palette);
|
||||
|
||||
// 设置背景色:方法二
|
||||
//this->setObjectName("PanelBase");
|
||||
//this->setStyleSheet("#PanelBase{background-color:rgb(30,50,100);border-radius:5px;}");
|
||||
|
||||
// 设置背景色
|
||||
QUI::setBackground(this, "PanelBase", QColor(29, 54, 102, 50));
|
||||
setMouseTracking(true);
|
||||
if (!title.empty())
|
||||
{
|
||||
// 渐变
|
||||
std::string styBkg = "background-color:qlineargradient(x1:0,y1:0, x2:1,y2:0,stop:0 rgb(3,208,242),stop:0.9 rgba(3,208,242,0));";
|
||||
// background-color:rgba(3, 208, 242, 200);
|
||||
QUI::label(labBkg_, this, 10, 30, this->width()-20, 2, "", styBkg);
|
||||
QUI::label(labIcon_, this, 10, 7, 6, 16, "", "background-color:rgb(33, 255, 210);");
|
||||
QUI::label(labTitle_, this, 20, 5, this->width(), 20, title.c_str(), "color:rgb(99, 196, 216);font:bold 16px;");
|
||||
}
|
||||
|
||||
this->show();
|
||||
}
|
||||
|
||||
void Panel::setBackground(QColor color, std::string border)
|
||||
{
|
||||
QUI::setBackground(this, "PanelBase", color, border);
|
||||
}
|
||||
|
||||
ChartBarView::ChartBarView(QWidget* parent, QRect rt, int xfrag)
|
||||
: QChartView(parent)
|
||||
, xfrag_(xfrag)
|
||||
{
|
||||
QFont font("微软雅黑", 9);
|
||||
this->setGeometry(rt);
|
||||
QColor labColor(255, 255, 255);
|
||||
|
||||
QUI::label(labTitle_, this, 0, 0, this->width(), 24, "");
|
||||
labTitle_.setAlignment(Qt::AlignHCenter);
|
||||
labTitle_.setFont(QFont("微软雅黑", 12, 100));
|
||||
|
||||
this->setFont(QFont("微软雅黑", 8));
|
||||
chart_ = std::make_shared<QChart>();
|
||||
chart_->setTitleFont(font);
|
||||
chart_->setMargins(QMargins(0,0,0,0));
|
||||
//chart_->setAnimationOptions(QChart::SeriesAnimations); // 动画方式
|
||||
setChart(chart_.get());
|
||||
|
||||
// === 初始化序列 ==============================================================
|
||||
series_ = std::make_shared<QBarSeries>();
|
||||
series_->setBarWidth(0.8);
|
||||
chart_->addSeries(series_.get());
|
||||
|
||||
// === 初始化X轴 ==============================================================
|
||||
// 创建 X 轴并设置其分类标签
|
||||
QStringList ticksX;
|
||||
for (int i = 1; i <= xfrag; ++i) {
|
||||
ticksX << QString::number(i);
|
||||
}
|
||||
axisX_ = std::make_shared<QBarCategoryAxis>();
|
||||
axisX_->setLabelsColor(labColor); // 设置X轴的颜色
|
||||
axisX_->setGridLineVisible(false);
|
||||
axisX_->append(ticksX); // 将分类标签添加到 X 轴
|
||||
chart_->addAxis(axisX_.get(), Qt::AlignBottom); // 将 X 轴添加到图表底部
|
||||
series_->attachAxis(axisX_.get()); // 将柱状图系列与 X 轴关联
|
||||
|
||||
// === 初始化Y轴 ==============================================================
|
||||
axisYLeft_ = std::make_shared<QValueAxis>();
|
||||
axisYLeft_->setGridLineColor(QColor(200, 200, 200, 100));
|
||||
axisYLeft_->setTickCount(6);
|
||||
axisYLeft_->setRange(0, 10); // 设置 Y 轴的范围为 0 到 100
|
||||
chart_->addAxis(axisYLeft_.get(), Qt::AlignLeft); // 将 Y 轴添加到图表左侧
|
||||
series_->attachAxis(axisYLeft_.get()); // 将柱状图系列与 Y 轴关联
|
||||
axisYLeft_->setLabelsColor(labColor);
|
||||
|
||||
// 设置背景色
|
||||
this->setBackground(QColor(30, 50, 100, 50));
|
||||
|
||||
// === 初始化柱体 ==============================================================
|
||||
//QBarSet* set1 = new QBarSet("10/01");
|
||||
//for (int i = 1; i <= xfrag; ++i) { *set1 << i; }
|
||||
//series_->append(set1);
|
||||
//this->addBar("日换电次数1");
|
||||
//this->addBar("日换电次数2");
|
||||
//this->addBar("日换电次数3");
|
||||
//this->addBar("日换电次数4");
|
||||
|
||||
//// === 示例:更新bar的数据
|
||||
//set1->replace(0, 8);
|
||||
|
||||
//// === 示例:更新X轴
|
||||
//QStringList ticksX2;
|
||||
//for (int i = 1; i <= xfrag; ++i) {
|
||||
// ticksX2 << QString::number(100+i);
|
||||
//}
|
||||
//axisX_->setCategories(ticksX2);
|
||||
|
||||
chart_->axisX()->setLabelsFont(font);
|
||||
chart_->axisY()->setLabelsFont(font);
|
||||
chart_->axisX()->setTitleFont(font);
|
||||
chart_->axisY()->setTitleFont(font);
|
||||
|
||||
// 设置图例在图表中的位置
|
||||
// 参数1: 水平位置
|
||||
// 参数2: 垂直位置
|
||||
// 参数3: 对齐方式
|
||||
// , Qt::HorizontalAlignment::Right, Qt::VerticalAlignment::Top
|
||||
|
||||
// 附着图表
|
||||
//chart_->legend()->attachToChart();
|
||||
//// 位于图表上方
|
||||
//chart_->legend()->setAlignment(Qt::AlignTop);
|
||||
//// 位于图表下方
|
||||
//chart_->legend()->setAlignment(Qt::AlignBottom);
|
||||
//// 位于图表左侧
|
||||
//chart_->legend()->setAlignment(Qt::AlignLeft);
|
||||
//// 位于图表右侧
|
||||
//chart_->legend()->setAlignment(Qt::AlignRight);
|
||||
//// 不附着图表
|
||||
//chart_->legend()->detachFromChart();
|
||||
chart_->legend()->setFont(g_font);
|
||||
chart_->legend()->setLabelColor(labColor);
|
||||
chart_->legend()->setAlignment(Qt::AlignTop);
|
||||
//chart_->legend()->setGeometry(QRectF(50, 0, this->width(), 24));
|
||||
//chart_->legend()->update();
|
||||
}
|
||||
|
||||
void ChartBarView::setTitle(std::string title)
|
||||
{
|
||||
//chart_->setTitle(title.c_str());
|
||||
labTitle_.setText(title.c_str());
|
||||
labTitle_.setGeometry(0, 10, this->width(), 24);
|
||||
|
||||
QMargins margin;
|
||||
margin.setTop(40);
|
||||
chart_->setMargins(margin);
|
||||
chart_->legend()->setGeometry(QRectF(50, 20, this->width(), 24));
|
||||
}
|
||||
|
||||
std::shared_ptr<QChart> ChartBarView::chart()
|
||||
{
|
||||
return chart_;
|
||||
}
|
||||
|
||||
QBarSet& ChartBarView::addItem(std::string name)
|
||||
{
|
||||
int index = series_->barSets().size();
|
||||
QBarSet* barSet = new QBarSet(name.c_str());
|
||||
//bar初始化数据
|
||||
for (int i = 1; i <= xfrag_; ++i) { *barSet << 0; }
|
||||
//// === 示例:更新bar的数据
|
||||
//barSet->replace(0, 8);
|
||||
series_->append(barSet);
|
||||
chart_->legend()->setGeometry(QRectF(50, 0, this->width(), 24));
|
||||
return *barSet;
|
||||
}
|
||||
|
||||
void ChartBarView::updateItem(int index, std::vector<double>& vd)
|
||||
{
|
||||
QBarSet* barSet = this->getBar(index);
|
||||
if (barSet)
|
||||
{
|
||||
for (int i = 0; i < xfrag_ && i< vd.size(); ++i)
|
||||
{
|
||||
barSet->replace(i, vd[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QBarSet* ChartBarView::getBar(int index)
|
||||
{
|
||||
auto lstBarSet = series_->barSets();
|
||||
if (index < lstBarSet.size())
|
||||
{
|
||||
return lstBarSet[index];
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void ChartBarView::setBackground(QColor& color)
|
||||
{
|
||||
//this->setAutoFillBackground(true);
|
||||
//QPalette palette;
|
||||
//palette.setColor(QPalette::Window, color); // 设置背景色
|
||||
//this->setPalette(palette);
|
||||
|
||||
QUI::setBackground(this, "ChartBarView", color);
|
||||
//this->setObjectName("ChartBarView");
|
||||
//this->setStyleSheet("#ChartBarView{background-color:rgb(29,54,102);border-radius:5px;}");
|
||||
|
||||
chart_->setBackgroundBrush(QBrush(QColor(100,100,100,0))); // 设置背景色
|
||||
chart_->setBackgroundVisible(true);
|
||||
}
|
||||
|
||||
void ChartBarView::setAxisXTick(std::vector<std::string>& vecTick)
|
||||
{
|
||||
QStringList ticks;
|
||||
for (int i = 0; i < xfrag_ && i<vecTick.size(); ++i) {
|
||||
ticks << vecTick[i].c_str();
|
||||
}
|
||||
axisX_->setCategories(ticks);
|
||||
}
|
||||
|
||||
ChartLineView::ChartLineView(QWidget* parent, QRect rt) : QChartView(parent)
|
||||
{
|
||||
QColor labColor(255, 255, 255);
|
||||
QUI::setBackground(this, "ChartLineView1", QColor(30, 50, 100, 50));
|
||||
this->setGeometry(rt);
|
||||
// 图表视图
|
||||
//QChartView* chartView = new QChartView(chart, wParent);
|
||||
|
||||
//this->setGeometry(10, 30, 900, 240);
|
||||
//this->setRenderHint(QPainter::Antialiasing); // 反锯齿绘制
|
||||
|
||||
// 图表
|
||||
chart_ = std::make_shared<QChart>();
|
||||
chart_->setBackgroundBrush(QBrush(QColor(100, 100, 100, 0))); // 设置背景色
|
||||
chart_->setBackgroundVisible(true);
|
||||
//chart_->setAnimationOptions(QChart::SeriesAnimations); // 动画方式
|
||||
//chart_->setTheme(QtCharts::QChart::ChartThemeBlueNcs); // 设置主题
|
||||
//chart_->setTitle("方位角数据"); // 设置标题
|
||||
chart_->setMargins(QMargins(0, 0, 0, 0));
|
||||
this->setChart(chart_.get());
|
||||
|
||||
QDateTime curDateTIme = QDateTime::currentDateTime();
|
||||
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
|
||||
|
||||
// x轴(时间轴方式)
|
||||
axisX = std::make_shared<QDateTimeAxis>();
|
||||
axisX->setLabelsColor(labColor);
|
||||
//axisX->setTitleText("时间(分:秒)"); // x轴显示标题
|
||||
axisX->setGridLineVisible(false); // 隐藏背景网格X轴框线
|
||||
axisX->setFormat("hh:mm"); // x轴格式
|
||||
axisX->setLabelsAngle(0); // x轴显示的文字倾斜角度
|
||||
axisX->setTickCount(10); // 轴上点的个数
|
||||
axisX->setRange(curDateTIme, curDateTIme.addSecs(10)); // 范围
|
||||
axisX->setLabelsFont(QFont("微软雅黑", 9));
|
||||
|
||||
// y轴
|
||||
axisY = std::make_shared<QValueAxis>();
|
||||
axisY->setGridLineColor(QColor(200, 200, 200, 100));
|
||||
axisY->setLabelsColor(labColor);
|
||||
//AxisY->setTitleText("角度"); // y轴显示标题
|
||||
axisY->setRange(0, 20); // 范围
|
||||
axisY->setTickCount(6); // 轴上点的个数
|
||||
axisY->setGridLineVisible(true); // 背景网格Y轴框线
|
||||
axisY->setLabelsFont(QFont("微软雅黑", 9));
|
||||
|
||||
chart_->addAxis(axisX.get(), Qt::AlignBottom); // 设置x轴位置
|
||||
chart_->addAxis(axisY.get(), Qt::AlignLeft); // 设置y轴位置
|
||||
|
||||
// 图例
|
||||
//chart_->legend()->detachFromChart();
|
||||
chart_->legend()->setFont(g_font);
|
||||
chart_->legend()->setLabelColor(labColor);
|
||||
chart_->legend()->setVisible(true); // 图例显示
|
||||
chart_->legend()->setAlignment(Qt::AlignTop); // 图例向下居中
|
||||
}
|
||||
|
||||
void ChartLineView::addItem(std::string name)
|
||||
{
|
||||
auto series = std::make_shared< QLineSeries>();
|
||||
chart_->addSeries(series.get()); // 添加线段
|
||||
series->attachAxis(axisX.get()); // 线段依附的x轴
|
||||
series->attachAxis(axisY.get()); // 线段依附的y轴
|
||||
series->setName(name.c_str()); // 线段名称,在图例会显示
|
||||
vecSeries_.push_back(series);
|
||||
//series->setPen(QPen(Qt::red, 0.6, Qt::SolidLine)); // 设置线段pen
|
||||
}
|
||||
|
||||
//#include "common/TimeUtils.h"
|
||||
void ChartLineView::updateItem(int index, std::vector<std::pair<double, double>>& vd)
|
||||
{
|
||||
if (index >= vecSeries_.size()) { return; }
|
||||
|
||||
auto& series = vecSeries_[index];
|
||||
series->clear();
|
||||
for (int i = 0; i < vd.size(); ++i)
|
||||
{
|
||||
series->append(vd[i].first, vd[i].second);
|
||||
}
|
||||
|
||||
//int64_t t0 = TimeUtils::datetime2tms(TimeUtils::now_date() + " 00:00:00");
|
||||
//int64_t tx = t0;
|
||||
//for (int i = 0; i<=240; i++)
|
||||
//{
|
||||
// tx = t0 + (i*360)*1000;
|
||||
// series->append(tx, qrand()%18);
|
||||
//}
|
||||
//this->setAxisX(t0, tx, 13);
|
||||
//this->setAxisYLeft(0, 20, 6);
|
||||
|
||||
//QDateTime t0 = QDateTime::fromString("2024-11-28 00:00:00", "yyyy-MM-dd hh:mm:ss");
|
||||
//QDateTime tx;
|
||||
//for (int i = 0; i<=240; i++)
|
||||
//{
|
||||
// tx = t0.addSecs(i*360);
|
||||
// series->append(tx.toMSecsSinceEpoch(), qrand()%18);
|
||||
//}
|
||||
//this->setAxisX(t0.toMSecsSinceEpoch(), tx.toMSecsSinceEpoch(), 13);
|
||||
//this->setAxisYLeft(0, 20, 6);
|
||||
}
|
||||
void ChartLineView::setAxisX(double min, double max, int tickCount, std::string fmt)
|
||||
{
|
||||
axisX->setRange(QDateTime::fromMSecsSinceEpoch(min), QDateTime::fromMSecsSinceEpoch(max)); // 范围
|
||||
axisX->setTickCount(tickCount); // 轴上点的个数
|
||||
axisX->setFormat(fmt.c_str());
|
||||
}
|
||||
|
||||
void ChartLineView::setAxisYLeft(double min, double max, double tickCount, std::string fmt)
|
||||
{
|
||||
axisY->setRange(min, max);
|
||||
axisY->setTickCount(tickCount);
|
||||
axisY->setLabelFormat(fmt.c_str());
|
||||
}
|
||||
|
||||
ProgressView::ProgressView(QWidget* parent, int x, int y, int h, int w, int d, int n)
|
||||
: QWidget(parent)
|
||||
, num_(n)
|
||||
{
|
||||
this->setGeometry(x, y, (w+d)*num_+4+42, h);
|
||||
this->show();
|
||||
vecBar_.resize(num_);
|
||||
|
||||
const std::string STY_LAB = "font:bold 14px;color:white;";
|
||||
|
||||
QUI::label(labBarBkg_, this, 0, 0, width(), height(), "", "border-width:1px;border-style:solid;border-color:rgba(40,169,222,255);");
|
||||
for (int i = 0; i < num_; i++)
|
||||
{
|
||||
vecBar_[i] = QUI::label(this, 2+i*(w+d), 2, w, height() - 4, "", "background-color:rgba(255,255,255,30);");
|
||||
}
|
||||
QUI::label(labVal_, this, width()-42, 0, 40, height(), "100%", STY_LAB);
|
||||
//labVal_.setAlignment(Qt::AlignRight | Qt::AlignVCenter);
|
||||
}
|
||||
|
||||
void ProgressView::setVal(int v)
|
||||
{
|
||||
if (v<0) { v = 0; }
|
||||
if (v>100) { v = 100; }
|
||||
labVal_.setText(QString::number(v) + "%");
|
||||
float c = float(v)*0.01;
|
||||
int index = c*float(num_) - 1;
|
||||
for (int i = 0; i<num_; i++)
|
||||
{
|
||||
int r = 0 + 255.0f*float(i)/float(num_);
|
||||
int g = 255 - 255.0f*float(i)/float(num_);
|
||||
std::string strColor = "background-color:rgba(" + std::to_string(r) + "," + std::to_string(g) + ",0,255);";
|
||||
vecBar_[i]->setStyleSheet(index>=i ? strColor.c_str() : "background-color:rgba(255,255,255,30);");
|
||||
}
|
||||
}
|
||||
|
||||
LabelPairV::LabelPairV(QWidget* parent, QRect rt, int h, std::string k, std::string v)
|
||||
{
|
||||
QUI::label(labV_, parent, rt.x(), rt.y(), rt.width(), h, v);
|
||||
QUI::label(labK_, parent, rt.x(), rt.y()+h, rt.width(), rt.height()-h, k);
|
||||
labV_.setAlignment(Qt::AlignCenter);
|
||||
labK_.setAlignment(Qt::AlignCenter);
|
||||
}
|
||||
void LabelPairV::setVal(std::string v, std::string sty/* = ""*/)
|
||||
{
|
||||
labV_.setText(v.c_str());
|
||||
if (!sty.empty()) { labV_.setStyleSheet(sty.c_str()); }
|
||||
}
|
||||
void LabelPairV::setValStyle(std::string sty)
|
||||
{
|
||||
labV_.setStyleSheet(sty.c_str());
|
||||
}
|
||||
void LabelPairV::setKeyStyle(std::string sty)
|
||||
{
|
||||
labK_.setStyleSheet(sty.c_str());
|
||||
}
|
||||
void LabelPairV::setStyle(std::string styK, std::string styV /*= ""*/)
|
||||
{
|
||||
this->setKeyStyle(styK);
|
||||
this->setValStyle(styV);
|
||||
}
|
||||
|
||||
LabelPairH::LabelPairH(QWidget* parent, QRect rt, int w, std::string k, std::string v)
|
||||
{
|
||||
QUI::label(labK_, parent, rt.x(), rt.y(), w, rt.height(), k);
|
||||
QUI::label(labV_, parent, rt.x()+w, rt.y(), rt.width()-w, rt.height(), v);
|
||||
}
|
||||
|
||||
void LabelPairH::setVal(std::string v, std::string sty/* = ""*/)
|
||||
{
|
||||
labV_.setText(v.c_str());
|
||||
if (!sty.empty()) { labV_.setStyleSheet(sty.c_str()); }
|
||||
}
|
||||
|
||||
void LabelPairH::setValStyle(std::string sty)
|
||||
{
|
||||
labV_.setStyleSheet(sty.c_str());
|
||||
}
|
||||
|
||||
void LabelPairH::setKeyStyle(std::string sty)
|
||||
{
|
||||
labK_.setStyleSheet(sty.c_str());
|
||||
}
|
||||
void LabelPairH::setStyle(std::string styK, std::string styV /*= ""*/)
|
||||
{
|
||||
this->setKeyStyle(styK);
|
||||
this->setValStyle(styV);
|
||||
}
|
||||
|
||||
static const std::string STY_TAB_BTN = R"(
|
||||
QPushButton { background-color:rgb(240,120,0);border-radius:0px;font:bold 14px;color:white;border:1px solid #20a481; }
|
||||
QPushButton:hover { background-color:rgba(32,164,128,255);color:white; }
|
||||
QPushButton:pressed { border-width:3px 0 0 3px;border-style:inset;color:white;}
|
||||
)";
|
||||
|
||||
static const std::string STY_TAB = R"(
|
||||
QTableWidget
|
||||
{
|
||||
background-color:rgb(37, 89, 120);
|
||||
alternate-background-color:rgb(57, 103, 130);
|
||||
color:white;
|
||||
font:bold 13px;
|
||||
selection-background-color:rgba(53, 125, 203, 100);
|
||||
}
|
||||
QTableWidget::item {padding-left:0px;text-align:center;color:rgba(255,255,255,200);}
|
||||
QTableWidget::item:selected {color:#FFFFFF; background: rgba(53, 125, 203,100);}
|
||||
)";
|
||||
|
||||
|
||||
//QTableWidget::item:hover
|
||||
//{
|
||||
// color:#FFFFFF;
|
||||
// background: #4B4B4D;
|
||||
//}
|
||||
|
||||
//QHeaderView::section,QTableCornerButton:section
|
||||
//{
|
||||
// text-align:center;
|
||||
// padding:3px;
|
||||
// margin:0px;
|
||||
// color:#DCDCDC;
|
||||
// border:1px solid #242424;
|
||||
// border-left-width:0px;
|
||||
// border-right-width:1px;
|
||||
// border-top-width:0px;
|
||||
// border-bottom-width:1px;
|
||||
// background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #646464,stop:1 #525252);
|
||||
// }
|
||||
//QHeaderView::section:selected
|
||||
//{
|
||||
// color:#FFFFFF;
|
||||
// border:1px solid #242424;
|
||||
//}
|
||||
//QScrollBar:vertical{
|
||||
// width:8px;
|
||||
// border-style:flat;
|
||||
// border-radius: 4px;
|
||||
// border:0px;
|
||||
// background: #19191A;
|
||||
//}
|
||||
//QScrollBar::handle:vertical{
|
||||
// background: rgba(255,255,255,0.50);
|
||||
// border-radius: 4px;
|
||||
// width:8px;
|
||||
// min-height:91px;
|
||||
// border-style:flat;
|
||||
//}
|
||||
//QScrollBar::handle:vertical::hover{
|
||||
// background: rgba(255,255,255,0.90);
|
||||
// border-radius: 4px;
|
||||
// width:8px;
|
||||
//}
|
||||
//QScrollBar::handle:vertical::pressed{
|
||||
// background: rgba(255,255,255,0.90);
|
||||
// border-radius:4px;
|
||||
// width:8px;
|
||||
//}
|
||||
//QScrollBar::sub-page:vertical {
|
||||
// background: #19191A;
|
||||
//border-style:flat;
|
||||
//}
|
||||
//QScrollBar::add-page:vertical {
|
||||
// background: #19191A;
|
||||
//border-style:flat;
|
||||
//}
|
||||
//QScrollBar::add-line:vertical{
|
||||
// background: #19191A;
|
||||
//}
|
||||
//QScrollBar::sub-line:vertical {
|
||||
// background: #19191A;
|
||||
//}
|
||||
//QScrollBar:horizontal{
|
||||
// height:8px;
|
||||
// border-style:flat;
|
||||
// border-radius: 4px;
|
||||
// border:0px;
|
||||
//background: #19191A;
|
||||
//}
|
||||
//QScrollBar::handle:horizontal{
|
||||
// background: rgba(255,255,255,0.50);
|
||||
// border-radius: 4px;
|
||||
// height:8px;
|
||||
// min-width:91px;
|
||||
// border-style:flat;
|
||||
//}
|
||||
//QScrollBar::handle:horizontal::hover{
|
||||
// background: rgba(255,255,255,0.90);
|
||||
// border-radius: 4px;
|
||||
// height:8px;
|
||||
//}
|
||||
//QScrollBar::handle:horizontal::pressed{
|
||||
// background: rgba(255,255,255,0.90);
|
||||
// border-radius:4px;
|
||||
// height:8px;
|
||||
//}
|
||||
//QScrollBar::sub-page:horizontal {
|
||||
// background: #19191A;
|
||||
// border-style:flat;
|
||||
//}
|
||||
//QScrollBar::add-page:horizontal {
|
||||
// background: #19191A;
|
||||
// border-style:flat;
|
||||
//}
|
||||
//QScrollBar::sub-line:horizontal {
|
||||
// background: #19191A;
|
||||
//}
|
||||
//QScrollBar::add-line:horizontal{
|
||||
// background: #19191A;
|
||||
//}
|
||||
|
||||
static const std::string STY_TAB_HEADER = R"(
|
||||
QHeaderView {background:rgb(46,53,97); font:bold 15px;}
|
||||
QHeaderView::section {background:rgb(46,53,97);color:white;border:1px solid gray;}
|
||||
)";
|
||||
|
||||
TableBase::TableBase(QWidget* parent, int rowMax, int colMax)
|
||||
{
|
||||
widget_ = std::make_shared<QTableWidget>(rowMax, colMax, parent);
|
||||
//this->setItemDelegate(new MyTableItemDelegate(this));
|
||||
|
||||
// "alternate-background-color:rgb(11,231,255);background-color:rgb(222,191,255);"
|
||||
widget_->setStyleSheet(STY_TAB.c_str());
|
||||
// 交替颜色
|
||||
widget_->setAlternatingRowColors(true);
|
||||
// 单元格编辑()
|
||||
widget_->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||||
// 选中一行
|
||||
widget_->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||
|
||||
// === 水平表头
|
||||
auto horiHeader = widget_->horizontalHeader();
|
||||
horiHeader->setFixedHeight(40);
|
||||
horiHeader->setStyleSheet(STY_TAB_HEADER.c_str());
|
||||
|
||||
// === 垂直表头
|
||||
auto vertHeader = widget_->verticalHeader();
|
||||
// 隐藏垂直表头
|
||||
vertHeader->setVisible(false);
|
||||
// 设置默认行高
|
||||
vertHeader->setDefaultSectionSize(32);
|
||||
}
|
||||
|
||||
TableBase::~TableBase()
|
||||
{
|
||||
widget_->clearContents();
|
||||
}
|
||||
|
||||
void TableBase::setGeometry(int x, int y, int w, int h)
|
||||
{
|
||||
if (widget_)
|
||||
{
|
||||
widget_->setGeometry(x, y, w, h);
|
||||
}
|
||||
}
|
||||
|
||||
void TableBase::setHeaderH(std::vector<std::string> vecHeader)
|
||||
{
|
||||
widget_->setColumnCount(vecHeader.size());
|
||||
QStringList strList;
|
||||
for (int i = 0; i<vecHeader.size(); ++i) { strList << vecHeader[i].c_str(); }
|
||||
widget_->setHorizontalHeaderLabels(strList);
|
||||
}
|
||||
|
||||
void TableBase::setHeaderWidth(std::vector<int> vecWidth)
|
||||
{
|
||||
for (int i = 0; i<vecWidth.size(); ++i)
|
||||
{
|
||||
if (vecWidth[i] > 0)
|
||||
{
|
||||
widget_->setColumnWidth(i, vecWidth[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TableBase::setOperate(std::vector<std::string> vecOperate, std::function<void(int, std::string)> cb)
|
||||
{
|
||||
cbOper_ = cb;
|
||||
vecOperate_ = vecOperate;
|
||||
//if (vecOperate_.size() > 0)
|
||||
{
|
||||
int colCount = widget_->columnCount();
|
||||
widget_->setColumnCount(colCount + 1);
|
||||
widget_->setHorizontalHeaderItem(colCount, new QTableWidgetItem("操作"));
|
||||
widget_->horizontalHeader()->setSectionResizeMode(colCount, QHeaderView::Stretch);
|
||||
}
|
||||
}
|
||||
|
||||
void TableBase::setRowData(int row, std::vector<std::string> vd)
|
||||
{
|
||||
int rowCount = widget_->rowCount();
|
||||
if (row >= rowCount)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int dataColCount = widget_->columnCount();
|
||||
if (vecOperate_.size() > 0)
|
||||
{
|
||||
dataColCount--;
|
||||
// 创建操作按钮
|
||||
if (vecWidgetOper_.size() != rowCount)
|
||||
{
|
||||
vecWidgetOper_.resize(rowCount, NULL);
|
||||
}
|
||||
std::shared_ptr<QWidget> wOpt = vecWidgetOper_[row];
|
||||
if (!wOpt)
|
||||
{
|
||||
wOpt = std::make_shared<QWidget>();
|
||||
wOpt->setMaximumSize(QSize(400, 40));
|
||||
vecWidgetOper_[row] = wOpt;
|
||||
|
||||
for (int i = 0; i<vecOperate_.size(); i++)
|
||||
{
|
||||
std::string operText = vecOperate_[i];
|
||||
QPushButton* btn = QUI::button(wOpt.get(), 5+85*i, 5, 80, 24, operText, UiStyle::BTN);
|
||||
QObject::connect(btn, &QPushButton::clicked, widget_.get(), [=]() { this->onOperate(row, operText); });
|
||||
}
|
||||
widget_->setCellWidget(row, dataColCount, wOpt.get());
|
||||
}
|
||||
}
|
||||
for (int col = 0; col<dataColCount; col++)
|
||||
{
|
||||
if (col < vd.size())
|
||||
{
|
||||
QTableWidgetItem* item = widget_->item(row, col);
|
||||
if (!item)
|
||||
{
|
||||
item = new QTableWidgetItem();
|
||||
widget_->setItem(row, col, item);
|
||||
}
|
||||
item->setText(vd[col].c_str());
|
||||
item->setTextAlignment(Qt::AlignCenter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TableBase::clear()
|
||||
{
|
||||
if (!widget_) { return; }
|
||||
widget_->clearContents();
|
||||
vecWidgetOper_.clear();
|
||||
}
|
||||
|
||||
std::shared_ptr<QTableWidget> TableBase::widget()
|
||||
{
|
||||
return widget_;
|
||||
}
|
||||
|
||||
void TableBase::onOperate(int row, std::string oper)
|
||||
{
|
||||
auto curItem = widget_->item(row, 0);
|
||||
widget_->setCurrentItem(curItem);
|
||||
|
||||
if (cbOper_) { cbOper_(row, oper); }
|
||||
|
||||
//curItem->setFlags(curItem->flags() | Qt::ItemIsEditable);
|
||||
//QPushButton* btn = qobject_cast<QPushButton*>(sender());
|
||||
//std::string text = btn->text().toStdString();
|
||||
}
|
||||
|
||||
PageCtrl::PageCtrl(QWidget* parent, QRect rt, int pageSize) : QWidget(parent), pageSize_(pageSize)
|
||||
{
|
||||
this->setGeometry(rt);
|
||||
QUI::setBackground(this, "PageCtrl", QColor(255, 0, 0, 30));
|
||||
|
||||
int x = 10;
|
||||
QUI::label(labTotal_, this, x, 5, 100, 24, "共0条");
|
||||
QUI::button(btnFirst_, this, x += 110, 5, 60, 24, "首页");
|
||||
QUI::button(btnPrev_, this, x += 70, 5, 60, 24, "上一页");
|
||||
QUI::label(labPage_, this, x += 70, 5, 100, 25, "0/0");
|
||||
QUI::button(btnNext_, this, x += 110, 5, 60, 24, "下一页");
|
||||
QUI::button(btnLast_, this, x += 70, 5, 60, 24, "尾页");
|
||||
|
||||
labPage_.setAlignment(Qt::AlignCenter);
|
||||
}
|
||||
|
||||
void PageCtrl::setPage(int pageId, int total)
|
||||
{
|
||||
curPage_ = pageId;
|
||||
int pageCount = total/pageSize_;
|
||||
if (total%pageSize_ > 0) { pageCount++; }
|
||||
|
||||
std::string s = "共" + std::to_string(total) + "条";
|
||||
labTotal_.setText(s.c_str());
|
||||
|
||||
s = std::to_string(curPage_) + "/" + std::to_string(pageCount);
|
||||
labPage_.setText(s.c_str());
|
||||
}
|
||||
Reference in New Issue
Block a user