#include "TransactionWindow.h" #include #include #include #include #include #include #include #include #include #include #include "dao/AccountDAO.h" #include "dao/TransactionDAO.h" class AmountDelegate : public QStyledItemDelegate { public: explicit AmountDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) { } void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override { QStyleOptionViewItem opt = option; initStyleOption(&opt, index); // Получаем значение суммы QString text = index.data().toString(); bool isNegative = text.toDouble() < 0; // Настраиваем цвета if (isNegative) { opt.backgroundBrush = QColor(255, 230, 230); // Светло-красный фон opt.palette.setColor(QPalette::Text, QColor(255, 0, 0)); // Красный текст } else { opt.backgroundBrush = QColor(230, 255, 230); // Светло-зеленый фон opt.palette.setColor(QPalette::Text, QColor(0, 128, 0)); // Зеленый текст } // Рисуем ячейку QStyledItemDelegate::paint(painter, opt, index); } }; QTableWidgetItem *createTableWidget(const QString &text) { QTableWidgetItem *item = new QTableWidgetItem(text); item->setTextAlignment(Qt::AlignLeft | Qt::AlignTop); return item; } TransactionWindow::TransactionWindow(const int accountId, QWidget *parent): QDialog(parent) { setWindowTitle("Транзакции"); setMinimumSize(800, 600); auto *mainLayout = new QVBoxLayout(this); // Скролл-область auto *scrollArea = new QScrollArea(this); scrollArea->setWidgetResizable(true); // Виджет-контейнер, в котором будет layout с таблицами и лейблами auto *contentWidget = new QWidget; auto *layout = new QVBoxLayout(contentWidget); // Убираем отступы и рамку contentWidget->setContentsMargins(0, 0, 0, 0); // Убираем отступы layout->setContentsMargins(0, 0, 0, 0); // Убираем отступы у layout scrollArea->setStyleSheet("border: none;"); // Убираем рамку layout->setAlignment(Qt::AlignTop); AccountInfo account = AccountDAO::getAccountById(accountId); QList transactions = TransactionDAO::getTransactions(accountId); QTableWidget *tableWidget = new QTableWidget(this); tableWidget->setStyleSheet( "QTableWidget {" " border: 1px solid grey;" " gridline-color: lightgrey;" " background-color: #f9f9f9;" " font-size: 14px;" "}" "QHeaderView::section {" " background-color: #e0e0e0;" " border: 1px solid grey;" " padding: 4px;" " font-weight: bold;" " text-align: left center;" "}" "QTableWidget::item {" " padding: 4px;" " border: none;" " text-align: left top;" "}" "QTableWidget::item:selected {" " background-color: #cce5ff;" " color: #003366;" "}" "QTableCornerButton::section {" " background-color: #e0e0e0;" " border: 1px solid grey;" "}" ); tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); tableWidget->setRowCount(transactions.length()); tableWidget->setColumnCount(7); tableWidget->setHorizontalHeaderLabels({ "Дата и время", "Сумма", "Банк", "Телефон", "Статус", "Описание", "" }); tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter); for (int i = 0; i < 5; ++i) { tableWidget->horizontalHeader()->setSectionResizeMode(i, QHeaderView::ResizeToContents); } tableWidget->horizontalHeader()->setSectionResizeMode(5, QHeaderView::Stretch); tableWidget->setItemDelegateForColumn(1, new AmountDelegate(tableWidget)); for (int k = 0; k < transactions.size(); ++k) { TransactionInfo tr = transactions[k]; tableWidget->setItem(k, 0, createTableWidget(tr.bankTime)); tableWidget->setItem(k, 1, createTableWidget(QString::number(tr.amount))); tableWidget->setItem(k, 2, createTableWidget(tr.bankName)); tableWidget->setItem(k, 3, createTableWidget(tr.phone)); tableWidget->setItem(k, 4, createTableWidget(transactionStatusToString(tr.status))); QTableWidgetItem *item = new QTableWidgetItem(tr.description); item->setTextAlignment(Qt::AlignLeft | Qt::AlignTop); item->setFlags(item->flags() & ~Qt::ItemIsEditable); item->setSizeHint(QSize(100, tr.description.length() / 2)); tableWidget->setItem(k, 5, item); if (!tr.receiptImage.isEmpty()) { auto *docBtn = new QPushButton("Документы", tableWidget); docBtn->setStyleSheet("background-color: #1565C0; color: white;"); tableWidget->setCellWidget(k, 6, docBtn); connect(docBtn, &QPushButton::clicked, this, [this, tr]() { QPixmap pixmap; pixmap.loadFromData(tr.receiptImage); if (pixmap.isNull()) return; auto *imgDialog = new QDialog(this); imgDialog->setWindowTitle("Документ"); imgDialog->setAttribute(Qt::WA_DeleteOnClose); auto *dlgLayout = new QVBoxLayout(imgDialog); auto *imgLabel = new QLabel(imgDialog); imgLabel->setPixmap(pixmap.scaled(600, 1000, Qt::KeepAspectRatio, Qt::SmoothTransformation)); dlgLayout->addWidget(imgLabel); imgDialog->resize(imgLabel->pixmap().size()); imgDialog->show(); }); } } layout->addWidget(tableWidget); tableWidget->resizeColumnsToContents(); tableWidget->resizeRowsToContents(); // Подгоняем ширину окна под содержимое таблицы int totalWidth = tableWidget->verticalHeader()->width() + tableWidget->frameWidth() * 2 + 20; for (int i = 0; i < tableWidget->columnCount(); ++i) { totalWidth += tableWidget->columnWidth(i); } resize(qMax(800, totalWidth), 600); // for (int row = 0; row < tableWidget->rowCount(); ++row) { // for (int col = 0; col < tableWidget->columnCount(); ++col) { // QTableWidgetItem *item = tableWidget->item(row, col); // if (item) { // item->setTextAlignment(Qt::AlignLeft | Qt::AlignTop); // } // } // } // Добавим вертикальный Spacer в конец, чтобы прокручиваемая область не растягивала контент // QSpacerItem *spacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); // layout->addItem(spacer); contentWidget->setLayout(layout); scrollArea->setWidget(contentWidget); mainLayout->addWidget(scrollArea); setLayout(mainLayout); setWindowTitle("Транзакции"); setModal(true); }