4 Star 100 Fork 28

Linloir/GraphBuilder

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
customWidgets.cpp 30.05 KB
一键复制 编辑 原始数据 按行查看 历史
Linloir 提交于 2021-12-05 15:47 . Fixed bugs
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
#include "customWidgets.h"
//*********************************************************//
//CustomIcon class implementation
//*********************************************************//
customIcon::customIcon(QString iconPath, QString hint, int r, QWidget *parent):
QPushButton(parent),
radius(r),
iconHint(hint){
QSvgRenderer renderer;
renderer.load(iconPath);
QSize size = renderer.defaultSize();
iconImg = new QPixmap(size);
iconImg->fill(Qt::transparent);
QPainter painter(iconImg);
painter.setRenderHints(QPainter::Antialiasing);
renderer.render(&painter);
widgetRatio = iconImg->height() / iconImg->width();
bgColor = defaultColor;
}
customIcon::customIcon(const QPixmap &icon, QString hint, int r, QWidget *parent):
QPushButton(parent),
radius(r),
iconHint(hint){
iconImg = new QPixmap(icon);
widgetRatio = iconImg->height() / iconImg->width();
bgColor = defaultColor;
}
void customIcon::paintEvent(QPaintEvent *event){
resize(height() / widgetRatio, height());
QPainter bgPainter(this);
bgPainter.setRenderHints(QPainter::Antialiasing);
bgPainter.setPen(Qt::NoPen);
bgPainter.setBrush(bgColor);
bgPainter.drawRoundedRect(this->rect(), radius, radius);
QPainter pixmapPainter(this);
pixmapPainter.setRenderHints(QPainter::Antialiasing);
pixmapPainter.translate(width() / 2, height() / 2);
pixmapPainter.rotate(rotation);
pixmapPainter.translate(-width() / 2, -height() / 2);
int w = iconSizeRate * width();
int h = iconSizeRate * height();
pixmapPainter.drawPixmap(width() / 2 - w / 2, height() / 2 - h / 2, w, h, *iconImg);
}
void customIcon::enterEvent(QEnterEvent *event){
bgColor = hoverColor;
update();
}
void customIcon::leaveEvent(QEvent *event){
bgColor = defaultColor;
update();
}
void customIcon::mousePressEvent(QMouseEvent *event){
emit clicked();
setFocus();
iconSizeRate -= 0.1;
update();
}
void customIcon::mouseReleaseEvent(QMouseEvent *event){
iconSizeRate += 0.1;
update();
}
//*********************************************************//
//selectionItem class implementation
//*********************************************************//
selectionItem::selectionItem(QString name, QString info, QWidget *parent) :
QWidget(parent){
/* set labels */
QFont titleFont = QFont("Corbel", 13);
QFontMetrics fm(titleFont);
qreal height = fm.lineSpacing();
title = new QLabel(this);
title->setText(name);
title->setFont(titleFont);
title->setMinimumHeight(height);
title->setStyleSheet("color:#2c2c2c");
title->setAlignment(Qt::AlignLeft | Qt::AlignBottom);
QFont descFont = QFont("Corbel Light", 11);
fm = QFontMetrics(descFont);
height = fm.lineSpacing();
description = new QLabel(this);
description->setText(info);
description->setFont(descFont);
description->setMinimumHeight(height);
description->setAlignment(Qt::AlignLeft | Qt::AlignTop);
description->setStyleSheet("color:#707070");
indicator = new QWidget(this);
/* set minimum height and layout */
setFixedHeight(title->height() + (info == "" ? 0 : description->height() + 5));
indicator->resize(6, 0.4 * this->height());
indicator->move(4, 0.3 * this->height());
indicator->setStyleSheet("border-radius:3px;background-color:#0078D4");
opac = new QGraphicsOpacityEffect(indicator);
opac->setOpacity(0);
indicator->setGraphicsEffect(opac);
QVBoxLayout *contentLayout = new QVBoxLayout(this);
contentLayout->setContentsMargins(20, 0, 0, 0);
contentLayout->setSpacing(2);
this->setLayout(contentLayout);
contentLayout->addWidget(title);
if(info != "")
contentLayout->addWidget(description);
contentLayout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
/* set background widget */
bgWidget = new QWidget(this);
bgWidget->resize(this->size());
bgWidget->setStyleSheet("border-radius:5px;background-color:#00000000");
bgWidget->lower();
bgWidget->show();
this->setMouseTracking(true);
}
void selectionItem::enterEvent(QEnterEvent *event){
bgWidget->setStyleSheet("border-radius:5px;background-color:#0a000000");
QParallelAnimationGroup *enter = new QParallelAnimationGroup(this);
QPropertyAnimation *longer = new QPropertyAnimation(indicator, "geometry", this);
longer->setStartValue(indicator->geometry());
longer->setEndValue(QRectF(4, 0.25 * this->height(), 6, this->height() * 0.5));
longer->setDuration(150);
longer->setEasingCurve(QEasingCurve::OutBack);
QPropertyAnimation *fadeIn = new QPropertyAnimation(opac, "opacity", this);
fadeIn->setStartValue(opac->opacity());
fadeIn->setEndValue(0.99);
fadeIn->setDuration(100);
enter->addAnimation(longer);
enter->addAnimation(fadeIn);
enter->start();
}
void selectionItem::leaveEvent(QEvent *event){
bgWidget->setStyleSheet("border-radius:5px;background-color:#00000000");
QParallelAnimationGroup *leave = new QParallelAnimationGroup(this);
QPropertyAnimation *shorter = new QPropertyAnimation(indicator, "geometry", this);
shorter->setStartValue(indicator->geometry());
shorter->setEndValue(QRectF(4, 0.3 * this->height(), 6, this->height() * 0.4));
shorter->setDuration(150);
shorter->setEasingCurve(QEasingCurve::OutBack);
QPropertyAnimation *fadeOut = new QPropertyAnimation(opac, "opacity", this);
fadeOut->setStartValue(opac->opacity());
fadeOut->setEndValue(onSelected ? 0.99 : 0);
fadeOut->setDuration(100);
leave->addAnimation(shorter);
leave->addAnimation(fadeOut);
leave->start();
if(mousePressed)
mousePressed = false;
}
void selectionItem::mousePressEvent(QMouseEvent *event){
bgWidget->setStyleSheet("border-radius:5px;background-color:#1a000000");
QPropertyAnimation *shorter = new QPropertyAnimation(indicator, "geometry", this);
shorter->setStartValue(indicator->geometry());
shorter->setEndValue(QRectF(4, 0.4 * this->height(), 6, this->height() * 0.2));
shorter->setDuration(100);
shorter->setEasingCurve(QEasingCurve::OutBack);
shorter->start();
mousePressed = true;
}
void selectionItem::mouseReleaseEvent(QMouseEvent *event){
if(mousePressed){
bgWidget->setStyleSheet("border-radius:5px;background-color:#0a000000");
QPropertyAnimation *longer = new QPropertyAnimation(indicator, "geometry", this);
longer->setStartValue(indicator->geometry());
longer->setEndValue(QRectF(4, 0.25 * this->height(), 6, this->height() * 0.5));
longer->setDuration(150);
longer->setEasingCurve(QEasingCurve::OutBack);
longer->start();
if(!onSelected){
onSelected = true;
title->setStyleSheet("color:#005FB8");
description->setStyleSheet("color:#3a8fb7");
emit selected(this);
setFocus();
}
mousePressed = false;
}
}
void selectionItem::resizeEvent(QResizeEvent *event){
bgWidget->resize(this->size());
}
void selectionItem::Select(){
if(!onSelected){
onSelected = true;
title->setStyleSheet("color:#005FB8");
description->setStyleSheet("color:#3a8fb7");
indicator->setGeometry(4, 0.5 * this->height(), 6, 0);
QParallelAnimationGroup *sel = new QParallelAnimationGroup(this);
QPropertyAnimation *longer = new QPropertyAnimation(indicator, "geometry", this);
longer->setStartValue(indicator->geometry());
longer->setEndValue(QRectF(4, 0.3 * this->height(), 6, this->height() * 0.4));
longer->setDuration(150);
longer->setEasingCurve(QEasingCurve::OutBack);
QPropertyAnimation *fadeIn = new QPropertyAnimation(opac, "opacity", this);
fadeIn->setStartValue(opac->opacity());
fadeIn->setEndValue(0.99);
fadeIn->setDuration(100);
sel->addAnimation(longer);
sel->addAnimation(fadeIn);
sel->start();
emit selected(this);
}
}
void selectionItem::Deselect(){
if(onSelected){
onSelected = false;
title->setStyleSheet("color:#2c2c2c");
description->setStyleSheet("color:#707070");
QPropertyAnimation *fadeOut = new QPropertyAnimation(opac, "opacity", this);
fadeOut->setStartValue(opac->opacity());
fadeOut->setEndValue(0);
fadeOut->setDuration(100);
fadeOut->start();
}
}
singleSelectGroup::singleSelectGroup(QString name, QWidget *parent) :
QWidget(parent){
QFont titleFont = QFont("Corbel", 16);
QFontMetrics fm(titleFont);
qreal height = fm.lineSpacing();
groupName = new QLabel(this);
groupName->setMinimumHeight(height);
groupName->setFont(titleFont);
groupName->setText(name);
QWidget *spacingLine = new QWidget(this);
spacingLine->setFixedHeight(1);
spacingLine->setStyleSheet("background-color:#0a000000");
this->setFixedHeight(groupName->height() + middleSpacing + 1 + bottomSpacing);
mainLayout = new QVBoxLayout(this);
mainLayout->setContentsMargins(10, 0, 10, bottomSpacing);
mainLayout->setSpacing(middleSpacing);
mainLayout->addWidget(groupName);
mainLayout->addWidget(spacingLine);
}
void singleSelectGroup::AddItem(selectionItem *item){
selections.push_back(item);
this->setFixedHeight(this->height() + middleSpacing + item->height());
mainLayout->addWidget(item);
if(selectedID == -1){
item->Select();
selectedID = 0;
}
connect(item, SIGNAL(selected(selectionItem*)), this, SLOT(changeSelection(selectionItem*)));
emit itemChange();
}
void singleSelectGroup::RemoveItem(selectionItem *item){
int id = selections.indexOf(item);
if(id < 0) return;
selections.erase(selections.begin() + id);
mainLayout->removeWidget(item);
item->setParent(nullptr);
item->deleteLater();
this->setFixedHeight(this->height() - middleSpacing - item->height());
if(selections.size() == 0)
selectedID = -1;
else{
selectedID = id < selections.size() ? id : id - 1;
selections[selectedID]->Select();
}
emit selectedItemChange(selectedID);
emit itemChange();
}
void singleSelectGroup::SetSelection(selectionItem *item){
int id = selections.indexOf(item);
selections[id]->Select();
}
void singleSelectGroup::changeSelection(selectionItem *item){
int id = selections.indexOf(item);
for(int i = 0; i < selections.size(); i++){
if(i == id) continue;
selections[i]->Deselect();
}
selectedID = id;
emit selectedItemChange(id);
}
horizontalValueAdjuster::horizontalValueAdjuster(QString name, qreal min, qreal max, qreal step, QWidget *parent) :
QWidget(parent),
curValue(min),
minValue(min),
maxValue(max),
stepValue(step)
{
QFont titleFont = QFont("Corbel", 16);
QFontMetrics fm(titleFont);
qreal height = fm.lineSpacing();
title = new QLabel(this);
title->setMinimumHeight(height);
title->setFont(titleFont);
title->setText(name);
QWidget *spacingLine = new QWidget(this);
spacingLine->setFixedHeight(1);
spacingLine->setStyleSheet("background-color:#0a000000");
slider = new QSlider(Qt::Horizontal, this);
slider->setMinimum(0);
slider->setMaximum((max - min) / step + 1);
slider->setPageStep(1);
QString grooveStyle = "QSlider::groove:horizontal{height:6px; border-radius:3px;} ";
QString sliderStyle = "QSlider::handle:horizontal{width:12px; margin-bottom:-3px; margin-top:-3px; background:#c2c2c2; border-radius:6px;} ";
QString sliderHStyle = "QSlider::handle:horizontal:hover{width:12px; margin-bottom:-3px; margin-top:-3px; background:#3a8fb7; border-radius:6px;} ";
QString sliderPStyle = "QSlider::handle:horizontal:pressed{width:12px; margin-bottom:-3px; margin-top:-3px; background:#005fb8; border-radius:6px;} ";
QString subStyle = "QSlider::sub-page:horizontal{background:#0078D4; border-radius:3px} ";
QString addStyle = "QSlider::add-page:horizontal{background:#1a000000; border-radius:3px} ";
slider->setStyleSheet(grooveStyle+sliderStyle+sliderHStyle+sliderPStyle+subStyle+addStyle);
QFont valueFont = QFont("Corbel", 13);
fm = QFontMetrics(titleFont);
height = fm.lineSpacing();
valueLabel = new QLabel(this);
valueLabel->setMinimumHeight(height);
valueLabel->setFont(valueFont);
valueLabel->setText(QString::asprintf("%g", min));
valueLabel->setMinimumWidth(30);
valueLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
valueLabel->setStyleSheet("margin-bottom:5px");
QWidget *content = new QWidget(this);
content->setMinimumHeight(valueLabel->height() < slider->height() ? valueLabel->height() : slider->height());
QHBoxLayout *contentLayout = new QHBoxLayout(content);
contentLayout->setAlignment(Qt::AlignVCenter);
content->setLayout(contentLayout);
contentLayout->setContentsMargins(0, 0, 0, 0);
contentLayout->setSpacing(10);
contentLayout->addWidget(valueLabel);
contentLayout->addWidget(slider);
this->setMinimumHeight(title->height() + 2 * middleSpacing + 1 + content->height() + bottomSpacing);
QVBoxLayout *mainLayout = new QVBoxLayout(this);
this->setLayout(mainLayout);
mainLayout->setContentsMargins(10, 0, 10, bottomSpacing);
mainLayout->setSpacing(middleSpacing);
mainLayout->addWidget(title);
mainLayout->addWidget(spacingLine);
mainLayout->addWidget(content);
connect(slider, &QSlider::valueChanged, this, [=](qreal value){
valueLabel->setText(QString::asprintf("%g", value * stepValue + minValue));
curValue = value * stepValue + minValue;
emit valueChanged(curValue);
});
}
void horizontalValueAdjuster::setValue(qreal value){
valueLabel->setText(QString::asprintf("%g", value));
slider->setValue((value - minValue) / stepValue);
curValue = value;
emit valueChanged(value);
}
//********************
//itemGroup::itemGroup(const QString &name, QWidget *parent){
// QFont titleFont = QFont("DengXian", 16, QFont::DemiBold);
// QFontMetrics fm(titleFont);
// qreal height = fm.lineSpacing();
// groupName = new QLabel(this);
// groupName->setFixedHeight(height);
// groupName->setFont(titleFont);
// groupName->setText(name);
//
// QWidget *spacingLine = new QWidget(this);
// spacingLine->setFixedHeight(1);
// spacingLine->setStyleSheet("background-color:#0a000000");
//
// this->setFixedHeight(groupName->height() + middleSpacing + 1 + bottomSpacing);
//
// mainLayout = new QVBoxLayout(this);
// mainLayout->setContentsMargins(10, 0, 10, bottomSpacing);
// mainLayout->setSpacing(middleSpacing);
// mainLayout->addWidget(groupName);
// mainLayout->addWidget(spacingLine);
//}
//
//void itemGroup::AddItem(QWidget *item){
// items.push_back(item);
// this->setFixedHeight(this->height() + middleSpacing + item->height());
// mainLayout->addWidget(item);
//}
//
//void itemGroup::RemoveItem(QWidget *item){
// items.erase(items.begin() + items.indexOf(item));
// mainLayout->removeWidget(item);
// this->setFixedHeight(this->height() - middleSpacing - item->height());
//}
//*****************
bigIconButton::bigIconButton(const QString &iconPath, const QString &description, int radius, QWidget *parent) :
QWidget(parent),
cornerRadius(radius)
{
iconImg = new QPixmap(iconPath);
/* set icon label and text label */
icon = new QLabel(this);
icon->setPixmap(*iconImg);
icon->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
icon->setAlignment(Qt::AlignCenter);
QFont textFont = QFont("Corbel", 13);
QFontMetrics fm(textFont);
text = new QLabel(this);
text->setFont(textFont);
text->setText(description);
text->setWordWrap(true);
text->setMinimumHeight(fm.lineSpacing());
text->setAlignment(Qt::AlignCenter);
/* set indicator */
indicator = new QWidget(this);
indicator->resize(6, 6);
indicator->move(this->width() - 3, this->height() - 21);
indicator->setStyleSheet("border-radius:3px;background-color:#afafaf");
/* set background */
bgWidget = new QWidget(this);
bgWidget->resize(this->size());
radiusStyle = QString::asprintf("border-radius:%dpx;", cornerRadius);
bgWidget->setStyleSheet(radiusStyle + "background-color:#04000000");
bgWidget->lower();
bgWidget->show();
/* set layout */
QVBoxLayout *layout = new QVBoxLayout(this);
this->setLayout(layout);
layout->setContentsMargins(15, 35, 15, 35);
layout->setSpacing(15);
layout->addWidget(icon);
layout->addWidget(text);
layout->setAlignment(Qt::AlignCenter);
this->setMinimumHeight(200);
}
void bigIconButton::resizeEvent(QResizeEvent *event){
bgWidget->setFixedSize(this->size());
if(onSelected){
indicator->resize(this->width() * 0.1, 6);
indicator->move(this->width() * 0.45, this->height() - 21);
}
else{
indicator->resize(this->width() * 0.1, 6);
indicator->move(this->width() * 0.45, this->height() - 21);
}
}
void bigIconButton::enterEvent(QEnterEvent *event){
bgWidget->setStyleSheet(radiusStyle + "background-color:#0a0078D4");
QPropertyAnimation *longer = new QPropertyAnimation(indicator, "geometry", this);
longer->setStartValue(indicator->geometry());
longer->setEndValue(QRectF(this->width() * 0.2, this->height() - 21, this->width() * 0.6, 6));
longer->setDuration(150);
longer->setEasingCurve(QEasingCurve::OutBack);
longer->start();
indicator->setStyleSheet("border-radius:3px;background-color:#0078d4");
}
void bigIconButton::leaveEvent(QEvent *event){
bgWidget->setStyleSheet(radiusStyle + "background-color:#04000000");
QPropertyAnimation *shorter = new QPropertyAnimation(indicator, "geometry", this);
shorter->setStartValue(indicator->geometry());
if(!onSelected)
shorter->setEndValue(QRectF(this->width() * 0.45, this->height() - 21, this->width() * 0.1, 6));
else
shorter->setEndValue(QRectF(this->width() * 0.3, this->height() - 21, this->width() * 0.4, 6));
shorter->setDuration(250);
shorter->setEasingCurve(QEasingCurve::OutBack);
shorter->start();
if(!onSelected)
indicator->setStyleSheet("border-radius:3px;background-color:#afafaf");
if(mousePressed)
mousePressed = false;
}
void bigIconButton::mousePressEvent(QMouseEvent *event){
bgWidget->setStyleSheet(radiusStyle + "background-color:#1a0078D4");
QPropertyAnimation *shorter = new QPropertyAnimation(indicator, "geometry", this);
shorter->setStartValue(indicator->geometry());
shorter->setEndValue(QRectF(this->width() * 0.4, this->height() - 21, this->width() * 0.2, 6));
shorter->setDuration(100);
shorter->setEasingCurve(QEasingCurve::OutBack);
shorter->start();
mousePressed = true;
}
void bigIconButton::mouseReleaseEvent(QMouseEvent *event){
if(mousePressed){
bgWidget->setStyleSheet(radiusStyle + "background-color:#0a0078D4");
QPropertyAnimation *longer = new QPropertyAnimation(indicator, "geometry", this);
longer->setStartValue(indicator->geometry());
longer->setEndValue(QRectF(this->width() * 0.2, this->height() - 21, this->width() * 0.6, 6));
longer->setDuration(150);
longer->setEasingCurve(QEasingCurve::OutBack);
longer->start();
mousePressed = false;
emit clicked();
if(selectable){
emit selected();
onSelected = true;
}
}
}
void bigIconButton::setScale(qreal scale){
iconImg = new QPixmap(iconImg->scaled(iconImg->size() * scale, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
icon->setPixmap(*iconImg);
}
textInputItem::textInputItem(const QString &name, QWidget *parent) :
QWidget(parent)
{
QFont nameFont = QFont("Corbel", 12);
QFontMetrics fm(nameFont);
qreal height = fm.lineSpacing();
itemName = new QLabel(this);
itemName->setText(name);
itemName->setFont(nameFont);
itemName->setFixedHeight(height);
itemName->setStyleSheet("color:#1c1c1c");
QFont textFont = QFont("Corbel", 12);
fm = QFontMetrics(textFont);
editor = new QLineEdit(this);
editor->setText("");
editor->setFixedHeight(fm.lineSpacing());
editor->setStyleSheet("color:#5c5c5c;background-color:#00000000;border-style:none;");
editor->setReadOnly(true);
editor->setFont(textFont);
bgWidget = new QWidget(this);
bgWidget->setStyleSheet("background-color:#00000000;border-radius:5px;");
bgWidget->lower();
bgWidget->show();
indicator = new QWidget(this);
indicator->setFixedHeight(4);
indicator->setStyleSheet("background-color:#0078d4;border-radius:2px");
opac = new QGraphicsOpacityEffect(this);
opac->setOpacity(0);
indicator->setGraphicsEffect(opac);
this->setFixedHeight(itemName->height() + 10);
connect(editor, &QLineEdit::returnPressed, this, [=](){
leaveEditEffect();
onEditing = false;
editor->setReadOnly(true);
curText = editor->text();
});
connect(editor, &QLineEdit::editingFinished, this, [=](){
leaveEditEffect();
onEditing = false;
editor->setReadOnly(true);
curText = editor->text();
QTimer *delay = new QTimer(this);
connect(delay, &QTimer::timeout, this, [=](){mousePressed = false;});
delay->setSingleShot(true);
delay->start(10);
mousePressed = false;
emit textEdited(curText);
});
}
void textInputItem::resizeEvent(QResizeEvent *event){
itemName->move(margin, this->height() / 2 - itemName->height() / 2);
itemName->setFixedWidth(this->width() * 0.3 - margin - spacing);
int width = QFontMetrics(editor->font()).size(Qt::TextSingleLine, editor->text()).width() + 3;
if(!onEditing){
if(width > this->width() * 0.7 - margin)
editor->resize(this->width() * 0.7 - margin, editor->height());
else
editor->resize(width, editor->height());
editor->move(this->width() - margin - editor->width(), this->height() / 2 - editor->height() / 2);
indicator->move(this->width() - margin, this->height() - 7);
}
else{
editor->resize(this->width() * 0.7 - margin, editor->height());
editor->move(this->width() * 0.3, this->height() / 2 - editor->height() / 2 - 2);
indicator->move(this->width() * 0.3, this->height() - 7);
}
bgWidget->setFixedSize(this->size());
}
void textInputItem::enterEditEffect(){
editor->setCursorPosition(editor->text().length());
editor->setStyleSheet("color:#1c1c1c;background-color:#00000000;border-style:none;");
QParallelAnimationGroup *group = new QParallelAnimationGroup(this);
QPropertyAnimation *longer = new QPropertyAnimation(indicator, "geometry", this);
longer->setStartValue(indicator->geometry());
longer->setEndValue(QRectF(this->width() * 0.3, this->height() - 7, this->width() * 0.7 - margin, 4));
longer->setDuration(500);
longer->setEasingCurve(QEasingCurve::InOutExpo);
QPropertyAnimation *fade = new QPropertyAnimation(opac, "opacity", this);
fade->setStartValue(opac->opacity());
fade->setEndValue(0.99);
fade->setDuration(150);
QPropertyAnimation *move = new QPropertyAnimation(editor, "geometry", this);
move->setStartValue(editor->geometry());
move->setEndValue(QRectF(this->width() * 0.3, this->height() / 2 - editor->height() / 2 - 2, this->width() * 0.7 - margin, editor->height()));
move->setDuration(500);
move->setEasingCurve(QEasingCurve::InOutExpo);
group->addAnimation(longer);
group->addAnimation(fade);
group->addAnimation(move);
group->start();
}
void textInputItem::leaveEditEffect(){
editor->setCursorPosition(0);
editor->setStyleSheet("color:#5c5c5c;background-color:#00000000;border-style:none;");
QParallelAnimationGroup *group = new QParallelAnimationGroup(this);
QPropertyAnimation *shorter = new QPropertyAnimation(indicator, "geometry", this);
shorter->setStartValue(indicator->geometry());
shorter->setEndValue(QRectF(this->width() - margin - 4, this->height() - 7, 4, 4));
shorter->setDuration(500);
shorter->setEasingCurve(QEasingCurve::InOutExpo);
QPropertyAnimation *fade = new QPropertyAnimation(opac, "opacity", this);
fade->setStartValue(opac->opacity());
fade->setEndValue(0);
fade->setDuration(350);
QPropertyAnimation *move = new QPropertyAnimation(editor, "geometry", this);
move->setStartValue(editor->geometry());
int width = QFontMetrics(editor->font()).size(Qt::TextSingleLine, editor->text()).width() + 3;
if(width > this->width() * 0.7 - margin)
move->setEndValue(QRectF(this->width() * 0.3, this->height() / 2 - editor->height() / 2, this->width() * 0.7 - margin, editor->height()));
else
move->setEndValue(QRectF(this->width() - width - margin, this->height() / 2 - editor->height() / 2, width, editor->height()));
move->setDuration(500);
move->setEasingCurve(QEasingCurve::InOutExpo);
group->addAnimation(shorter);
group->addAnimation(fade);
group->addAnimation(move);
group->start();
}
void textInputItem::enterEvent(QEnterEvent *event){
bgWidget->setStyleSheet("border-radius:5px;background-color:#0a000000");
}
void textInputItem::leaveEvent(QEvent *event){
bgWidget->setStyleSheet("border-radius:5px;background-color:#00000000");
}
void textInputItem::mousePressEvent(QMouseEvent *event){
bgWidget->setStyleSheet("border-radius:5px;background-color:#1a000000");
mousePressed = true;
}
void textInputItem::mouseReleaseEvent(QMouseEvent *event){
if(mousePressed){
bgWidget->setStyleSheet("border-radius:5px;background-color:#0a000000");
if(onEditing){
leaveEditEffect();
onEditing = false;
curText = editor->text();
editor->setReadOnly(true);
emit textEdited(curText);
}
else{
if(enabled){
enterEditEffect();
editor->raise();
onEditing = true;
editor->setReadOnly(false);
editor->setText(curText + "");
editor->setFocus();
}
}
mousePressed = false;
}
}
void textInputItem::setValue(const QString &text){
editor->setText(text);
editor->setCursorPosition(0);
curText = text;
int width = QFontMetrics(editor->font()).size(Qt::TextSingleLine, editor->text()).width() + 3;
if(!onEditing){
if(width > this->width() * 0.7 - margin)
editor->resize(this->width() * 0.7 - margin, editor->height());
else
editor->resize(width, editor->height());
editor->move(this->width() - margin - editor->width(), this->height() / 2 - editor->height() / 2);
}
else{
editor->resize(this->width() * 0.7 - margin, editor->height());
editor->move(this->width() * 0.3, this->height() / 2 - editor->height() / 2 - 2);
}
}
textButton::textButton(QString text, QWidget *parent, qreal ratio) :
QWidget(parent)
{
QFont textFont = QFont("Corbel", 10);
QFontMetrics fm(textFont);
qreal height = fm.lineSpacing();
btnText = new QLabel(this);
btnText->setText(text);
btnText->setFont(textFont);
btnText->setFixedHeight(height);
btnText->setFixedWidth(fm.size(Qt::TextSingleLine, text).width() + 2);
btnText->setStyleSheet("color:#1c1c1c");
btnText->setAlignment(Qt::AlignCenter);
bgWidget = new QWidget(this);
bgWidget->setStyleSheet("background-color:"+defaultColor+";border-radius:5px;");
this->setFixedHeight(btnText->height() / ratio);
}
textButton::textButton(QString text, QString defC, QString hoverC, QString pressedC, QWidget *parent, qreal ratio):
QWidget(parent),
defaultColor(defC),
hoverColor(hoverC),
pressedColor(pressedC)
{
QFont textFont = QFont("Corbel", 10);
QFontMetrics fm(textFont);
qreal height = fm.lineSpacing();
btnText = new QLabel(this);
btnText->setText(text);
btnText->setFont(textFont);
btnText->setFixedHeight(height);
btnText->setFixedWidth(fm.size(Qt::TextSingleLine, text).width() + 2);
btnText->setStyleSheet("color:#1c1c1c");
btnText->setAlignment(Qt::AlignCenter);
bgWidget = new QWidget(this);
bgWidget->setStyleSheet("background-color:"+defaultColor+";border-radius:5px;");
this->setFixedHeight(btnText->height() / ratio);
}
void textButton::resizeEvent(QResizeEvent *event){
bgWidget->resize(this->size());
btnText->move(this->width() / 2 - btnText->width() / 2, this->height() / 2 - btnText->height() / 2);
}
void textButton::enterEvent(QEnterEvent *event){
bgWidget->setStyleSheet("background-color:"+hoverColor+";border-radius:5px;");
}
void textButton::leaveEvent(QEvent *event){
bgWidget->setStyleSheet("background-color:"+defaultColor+";border-radius:5px;");
if(mousePressed){
bgWidget->setStyleSheet("background-color:"+pressedColor+";border-radius:5px;");
QPropertyAnimation *enlarge = new QPropertyAnimation(bgWidget, "geometry", this);
enlarge->setStartValue(bgWidget->geometry());
enlarge->setEndValue(QRect(0, 0, this->width(), this->height()));
enlarge->setDuration(150);
enlarge->setEasingCurve(QEasingCurve::OutBounce);
enlarge->start();
mousePressed = false;
}
}
void textButton::mousePressEvent(QMouseEvent *event){
bgWidget->setStyleSheet("background-color:"+pressedColor+";border-radius:5px;");
QPropertyAnimation *shrink = new QPropertyAnimation(bgWidget, "geometry", this);
shrink->setStartValue(bgWidget->geometry());
shrink->setEndValue(QRect(0.05 * this->width(), 0.05 * this->height(), this->width() * 0.9, this->height() * 0.9));
shrink->setDuration(100);
shrink->setEasingCurve(QEasingCurve::OutBack);
shrink->start();
mousePressed = true;
setFocus();
}
void textButton::mouseReleaseEvent(QMouseEvent *event){
if(mousePressed){
bgWidget->setStyleSheet("background-color:"+hoverColor+";border-radius:5px;");
QPropertyAnimation *enlarge = new QPropertyAnimation(bgWidget, "geometry", this);
enlarge->setStartValue(bgWidget->geometry());
enlarge->setEndValue(QRect(0, 0, this->width(), this->height()));
enlarge->setDuration(150);
enlarge->setEasingCurve(QEasingCurve::OutBounce);
enlarge->start();
mousePressed = false;
emit clicked();
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/linloir/GraphBuilder.git
git@gitee.com:linloir/GraphBuilder.git
linloir
GraphBuilder
GraphBuilder
main

搜索帮助