Russian Qt Forum
Апрель 20, 2024, 00:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2 3 ... 7
1  Qt / Вопросы новичков / Как хранить данные в модели?? : Май 13, 2020, 14:42
Добрый день! Есть модель в котором хранится данные на год, колонки это количесво дней в году а строки устанавливается пользователем. Представление должно показывать только выбранный пользователем месяц!  Храню данные в QHach <QModelIndex, QVAriant> но почему то данные сохраняются на один месяц  Плачущий Как реализовать сохранение данных по индексу на год 365 дней а отображать по выбранному месяцу Непонимающий

Код:
class modelG : public QAbstractTableModel
{
    Q_OBJECT

public:
    modelG(int row, int coll, QObject* parent = nullptr);


    // QAbstractItemModel interface
public:
    int _rowCount = 0;
    int _columnCount =0;
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    bool setData(const QModelIndex &index, const QVariant &value, int role);


    void showMonth(int month);

private:
    QDate _date;

protected:
    QHash<QModelIndex, QVariant> cellDate;


signals:
    void dataChanged(QModelIndex, QModelIndex);

    // QAbstractItemModel interface
public:
    Qt::ItemFlags flags(const QModelIndex &index) const;

};

//----------------------------------------------------------------------------------
class DegurnHaur : public modelG
{
    Q_OBJECT
public:
      DegurnHaur(QStringList nameDegurn,  QObject* parent = nullptr);

public slots:
      void setHoursDegurn(int idDegurn, QDate date, int haurs);
      void newData(int degurn, int day, int data);


private slots:
      //void newData(int degurn, int day, int data);

      // QAbstractItemModel interface
private:
      QStringList NameList;
public:
      QVariant headerData(int section, Qt::Orientation orientation, int role) const;
};

Код:
#include "modelg.h"

#include <QBrush>
#include <QColor>
#include <QDebug>


modelG::modelG(int row, int cols, QObject *parent)
    : QAbstractTableModel (parent), _rowCount(row), _columnCount(cols)
{
    //NameList << "Абдулганиева С" << "Курбанова С" << "Титова А" << "Чуркина Е" << "Абдулганиева А";
}

int modelG:: rowCount(const QModelIndex &) const
{
    return _rowCount;
}

int modelG::columnCount(const QModelIndex &) const
{
    return  _columnCount;
}

QVariant modelG::data(const QModelIndex &index, int role) const
{
    if(!index.isValid()){
        return QVariant();
    }
    if(role == Qt::DisplayRole || role == Qt::EditRole){
 //       qDebug() << _date.addDays(index.column()).dayOfYear();
        if(index.column()<_date.daysInMonth())
            return cellDate.value(index.sibling(index.row(), _date.addDays(index.column()).dayOfYear()), QVariant());
    }
    return QVariant();

}

bool modelG::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if(!index.isValid()){
        return false;
    }
    if(role == Qt::DisplayRole || role == Qt::EditRole){
        cellDate.insert(index,value);
        qDebug() << index.row();
        qDebug() << index.column();

        emit dataChanged(index, index);
    }
    return false;
}


void modelG::showMonth(int month)
{
    beginResetModel();
    _date = QDate::currentDate();
    _date.setDate(_date.year(), month, 1);
    _columnCount = _date.daysInMonth() + 3;
    qDebug() << cellDate;
//    for(int i=0; i<60; i++){
//       // int day =  _date.addDays(i).dayOfYear();
//        qDebug() << cellDate.value(index(0, i)) << i;
//    }
    endResetModel();
}


Qt::ItemFlags modelG::flags(const QModelIndex &index) const
{
    if (!index.isValid())
           return Qt::NoItemFlags;

       return Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable;
}

//-------------------------------------------------------------------------------

DegurnHaur::DegurnHaur(QStringList nameDegurn, QObject *parent)
    : modelG(nameDegurn.size(), 0, parent)
{
    NameList = nameDegurn;
    showMonth(1);
}

//----------------------замисываем данные по дату -------------------------
void DegurnHaur::setHoursDegurn(int idDegurn, QDate date, int haurs)
{

    newData(idDegurn, date.dayOfYear(), haurs);
}


//-----------------запись в модель
void DegurnHaur::newData(int degurn, int day, int data)
{
  //  qDebug() << day;
    setData(index(degurn, day), data, Qt::EditRole);
}

//--------------колонки и строки
QVariant DegurnHaur::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(orientation == Qt::Horizontal){
        switch (role) {
        case Qt::DisplayRole:
            if(section<(_columnCount-3)) return section+1;//NameList.at(section);
            else if(section==_columnCount-3) return "Факт";
            if(section==(_columnCount-2)) return "Норма";
            if(section==(_columnCount-1)) return "Пререр";
        break; case Qt::BackgroundRole:
            if(section<(_columnCount-3)){
//                QDate _date_t = _date;
//                _date_t.setDate(_date.year(), _date.month(), section+1);
//                if(_date_t.dayOfWeek()==6 || _date_t.dayOfWeek()==7) return QBrush(QColor(255, 150, 150, 80));  // окрас выходных
//                else return QBrush(QColor(200, 200, 200, 50));
            }
        }
    }
    if(orientation == Qt::Vertical){
        switch (role) {
        case Qt::DisplayRole:
            return NameList.at(section);
        }
    }
    return QVariant();
}
2  Qt / Вопросы новичков / Re: Как разделить столбцы на под столбцы : Май 11, 2019, 13:10
Решил проблему скрыв колонки и вместо них нарисовал в моделе и объединил с помощью setSpan .
3  Qt / Вопросы новичков / Как разделить столбцы на под столбцы : Май 10, 2019, 19:44
Отнаследовался от QAbstractTableModel и создал модель (отображение во вложении) , который отображает недельное расписание. Мне нужно разделить столбец на несколько под столбцов , как это сделать ?
Код:
#include "calendarmodel.h"
#include <QLocale>
#include <QBrush>
#include <QDebug>

CalendarModel::CalendarModel(QWidget *parent):QAbstractTableModel (parent)
{
    _inWorkTime.setHMS(8,0,0);
    _outWorkTime.setHMS(19,0,0);
    _date = QDate::currentDate();
     _firstDate = _date;
    setCalendarPage(_date.year(), _date.month());

}

void CalendarModel::setCalendarPage(int yoar, int mohth)
{
    beginResetModel();
    _firstDate = _firstDate.addDays(-_firstDate.dayOfWeek()+1);
    endResetModel();
}

int CalendarModel::rowCount(const QModelIndex &parent) const
{
    return (_outWorkTime.hour()-_inWorkTime.hour())+2;

}

int CalendarModel::columnCount(const QModelIndex &parent) const
{
    return 7;
}

QVariant CalendarModel::data(const QModelIndex &index, int role) const
{
    if(!index.isValid())
        return QVariant();
    switch (role) {
    case Qt::DisplayRole:

       // return headerData(index.row(),Qt::Horizontal, Qt::DisplayRole);
    case Qt::BackgroundRole:
        if(index.row()==0) return QBrush(QColor(220, 220, 220)); // цвет секции аудитории
        if(index.column()==5 || index.column()==6)  return QBrush(QColor(255, 199, 199));
         if(_date.toString("ddd.dd.MM") == headerData(index.column(),Qt::Horizontal, Qt::DisplayRole))
             return QBrush(QColor(255, 244, 158));

    }
    return QVariant();
}

QVariant CalendarModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(orientation == Qt::Horizontal){
        switch (role) {
        case Qt::DisplayRole:
           return _firstDate.addDays(section).toString("ddd.dd.MM");

        case Qt::BackgroundRole:
            if(section % 2 == 0){
                return QBrush(QColor(255, 241, 133));
            }
            else return QBrush(QColor(252, 227, 38));
        }

    }
    if(orientation == Qt::Vertical){
        switch (role) {
        case Qt::DisplayRole:
            if(section==0)return "Ауд";
            return QString::number((_inWorkTime.hour()-1)+section)+":00";
        case Qt::BackgroundRole:
            if(section==0) return QBrush(QColor(220, 220, 220)); // цвет секции аудитории

        }

    }
    return QVariant();
}

Или помогите партировать HierarchicalHeaderView (https://store.kde.org/p/1132194/) для Qt5.7
4  Qt / Вопросы новичков / Re: Как получить ссылку на объект QToolButton : Апрель 06, 2019, 17:20
Спасибо,получилось
5  Qt / Вопросы новичков / Как получить ссылку на объект QToolButton : Апрель 06, 2019, 15:59
Задача такая. Есть окно с кнопками QToolButton, вызываю контекстное меню, выбираю изменит название и редактирую название в qToolButton. Вопрос, как можно получить по координатам мыши ссылку на объект QToolButton? метод ui->centralWidget->childAt(Pos) выдает widget, а мне нужен метод QToolButton->setText();
Код:
void MainWindow::contextMenu(const QPoint & point)
{
    posWid = QCursor::pos();
    //int side = qMin(width(), height());
    qDebug() << this->pos();
    qDebug() << ui->centralWidget->mapFromGlobal(posWid);
    qDebug() << ui->kanal1->pos();

    QMenu *contextMenu = new QMenu(this);
    contextMenu->addAction(tr("Изменить название"));
    connect(contextMenu, SIGNAL(triggered(QAction*)), this, SLOT(renameChinal(QAction*)));
    contextMenu->exec(QCursor::pos());
    QWidget* bw = ui->centralWidget->childAt(ui->centralWidget->mapFromGlobal(posWid));
   

}
6  Qt / Базы данных / Re: QSqlTableModel и QtreeView древовидная структура отображения. : Март 11, 2019, 13:52
Спасибо за помощь

Код:
Qt::ItemFlags sqlTreeTableModel::flags(const QModelIndex &index) const {
    //QSqlTableModel doesn't allow children so use these flags
    if(index.isValid())
        return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
    else
        return 0;
7  Qt / Базы данных / QSqlTableModel и QtreeView древовидная структура отображения. : Март 09, 2019, 16:46
Добрый день форумчане, задача построить древовидную структуру из СУБД вид:

id  name  parent_id
1   name1    0
2   name1.1 1  
3   name2    0
4   name2.1 3

Нашел в интернете класс от наследованный от QAbstractProxyModel при запуске программы отображает только родителей то есть name1, name2.  Мучаюсь уже несколько дней, пожалуйста помогите.

Код:
#ifndef MY_SQLTABLEMODEL_H
#define MY_SQLTABLEMODEL_H
#include <QObject>
#include <QAbstractProxyModel>
#include <QSqlQuery>

class my_SqlTableModel : public QAbstractProxyModel
{
public:
    my_SqlTableModel(QObject* parent);


    // QSqlTableModel interface

    void setTable(const QString &tableName);

    // QAbstractItemModel interface

    QModelIndex index(int row, int column, const QModelIndex &parent) const;
    QModelIndex parent(const QModelIndex &child) const;
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const { return sourceModel()->columnCount(parent); }


    QVariant headerData(int section, Qt::Orientation orientation, int role) const { return sourceModel()->headerData(section,orientation,role); }
    bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role)  { return sourceModel()->setHeaderData(section,orientation,value,role); }


    QModelIndex mapToSource(const QModelIndex &proxyIndex) const;
    QModelIndex mapFromSource(const QModelIndex &sourceIndex) const;

    bool hasChildren(const QModelIndex &parent) const;

private:

    int getParentId(int childId) const;
    QSqlQuery* getChildren(int parentId) const;
};

#endif // MY_SQLTABLEMODEL_H

Код:
#include "my_sqltablemodel.h"
#include <QDebug>
my_SqlTableModel::my_SqlTableModel(QObject* parent):QAbstractProxyModel (parent)
{

}

QModelIndex my_SqlTableModel::mapFromSource(const QModelIndex &sourceIndex) const {
    if(!sourceIndex.isValid())
        return QModelIndex();

    int id = (sourceIndex.column() == 0) ? sourceIndex.data().toInt() : sourceIndex.sibling(sourceIndex.row(),0).data().toInt();

    int row = -1;
    QSqlQuery* q = getChildren(getParentId(id));
    while(q->next()) {
        row++;
        if(q->value(0).toInt() == id)
            break;
    }
    delete q;
    return createIndex(row, sourceIndex.column(), id);
}

QModelIndex my_SqlTableModel::mapToSource(const QModelIndex &proxyIndex) const {
    if(!proxyIndex.isValid())
        return QModelIndex();

    int id = proxyIndex.internalId();

    QSqlQuery q;
    q.exec("SELECT id FROM \"Аудитория\"");
    int row = -1;
    while(q.next()) {
        row++;
        //qDebug()<<q.value(0).toInt();
        if(q.value(0).toInt() == id)
            break;
    }
    return sourceModel()->index(row, proxyIndex.column());
}

bool my_SqlTableModel::hasChildren(const QModelIndex &parent) const {

    QSqlQuery q;
    q.prepare("SELECT COUNT(*) FROM \"Аудитория\" WHERE parent_id=?");
    q.addBindValue(parent.internalId());
    q.exec();
    q.first();
   // qDebug() << q.value(0).toInt();
    return q.value(0).toInt() > 0;
}

QModelIndex my_SqlTableModel::parent(const QModelIndex &childIndex) const {

    int childId  = childIndex.internalId();
    int parentId = getParentId(childId);

    qDebug() << childId;
    //qDebug() << parentId;
    if(parentId == 0)
        return QModelIndex();

    int parentRow = -1;
    QSqlQuery* q = getChildren(getParentId(parentId));
    while(q->next()) {
        parentRow++;
        if(q->value(0).toInt() == parentId)
            break;
    }
    delete q;
    return createIndex(parentRow, childIndex.row(), parentId);
}

QModelIndex my_SqlTableModel::index(int row, int column, const QModelIndex &parent) const {

    if(row < 0 || column < 0)
        return QModelIndex();

    QSqlQuery* q = getChildren(parent.internalId());
    q->seek(row);
    int id = q->value(0).toInt();
    delete q;
    return createIndex(row, column, id);
}

int my_SqlTableModel::rowCount(const QModelIndex &parent) const {

    QSqlQuery* q = getChildren(parent.internalId());

    //use last() and at() since SQLite does not support query size calls
    q->last();
    int size = q->at() + 1;
    delete q;
    return size;
}



int my_SqlTableModel::getParentId(int childId) const {
    QSqlQuery q;
    //qDebug()<<childId;
    q.prepare("SELECT parent_id FROM \"Аудитория\" WHERE id=?");
    q.addBindValue(childId);
    q.exec();
    q.first();
    //qDebug() << q.value(0).toInt();
    return q.value(0).toInt();
}

QSqlQuery* my_SqlTableModel::getChildren(int parentId) const {
    QSqlQuery* q = new QSqlQuery;
    //qDebug() << parentId;
    q->prepare("SELECT id FROM \"Аудитория\" WHERE parent_id=?");
    q->addBindValue(parentId);
    q->exec();
    //qDebug() << q->value(0).toInt();
    return q;
}
8  Qt / Вопросы новичков / Re: Модель-представление : Март 04, 2019, 23:26
Спасибо большое, че то я запарился ваше
9  Qt / Вопросы новичков / Модель-представление : Март 04, 2019, 17:04
Не могу понять почему моя модель не отображается???
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStringListModel>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QStringListModel model;
    model.setStringList(QStringList() << "sdfgs" << "asdf");
    ui->listView->setModel(&model);

}

MainWindow::~MainWindow()
{
    delete ui;
}

ListView пустой
10  Qt / Вопросы новичков / Re: QPainter в QTextDocument : Апрель 02, 2018, 08:54
Код:
void Printer::slotPrint(QPrinter *printer)
{
    //
    draw(printer);
    //textDocument->print(printer);
}

void Printer::draw(QPaintDevice *ppd)
{
    int Wd, Ht ;


    Wd = m_pprinter->width() ;
    Ht = m_pprinter->height() ;

    QPainter painter(ppd) ;


    barcode->makePattern(barcodeStr);

    qreal scale = painter.device()->logicalDpiX()/25.4;
    barcode->draw(QRectF(360, Ht-70, 29.83 * scale, 8.74* scale), painter) ;
   
   textDocument->drawContents(&painter);

    painter.end();

   }

Как такое не смог видеть, ай ай ай!!! Здесь есть кто ни будь? Что-то форум пустует.
11  Qt / Вопросы новичков / QPainter в QTextDocument : Март 30, 2018, 11:10
Как сделать так, чтобы QPainter рисовал в QTextDocument при этом чтобы текст, который там был не удалился?

Код:
Printer::Printer(QWidget *pwgt):QWidget(pwgt)
{
    m_pprinter = new QPrinter(QPrinter::HighResolution);

    textDocument = new QTextDocument;


    barcode = new EAN13(this);
    barcodeStr = "4650000000" ;
}

Printer::~Printer()
{
    delete m_pprinter;

    delete textDocument;
}

void Printer::slotPrint(QString data)
{
    m_pprinter->setPrinterName("Xprinter XP-360B");
    m_pprinter->setPageMargins(4,4,4,4, QPrinter::Millimeter);

    data.replace("12pt", "17pt");
    textDocument->setHtml(data);
    textDocument->setPageSize(m_pprinter->pageRect().size());

    QPrintPreviewDialog dialog(m_pprinter, this);
    connect(&dialog, SIGNAL(paintRequested(QPrinter*)), SLOT(slotPrint(QPrinter*)));
    dialog.exec();

}


void Printer::slotPrint(QPrinter *printer)
{
    //
    draw(printer);
    //textDocument->print(printer);
}

void Printer::draw(QPaintDevice *ppd)
{
    int Wd, Ht ;


    Wd = m_pprinter->width() ;
    Ht = m_pprinter->height() ;

    QPainter painter(ppd) ;


    barcode->makePattern(barcodeStr);

    qreal scale = painter.device()->logicalDpiX()/25.4;
    barcode->draw(QRectF(360, Ht-70, 29.83 * scale, 8.74* scale), painter) ;

    painter.end();

    textDocument->drawContents(&painter);
}


12  Qt / Вопросы новичков / Re: Принтер штрих кодов : Март 28, 2018, 15:12
Сам нашел
Код:
QTextDocument document;
document.setHtml("<p>Lorem ipsum</p>");
document.setPageSize(printer.pageRect().size()); // <-- Here is key to the solution
document.print(&printer);
13  Qt / Вопросы новичков / Принтер штрих кодов : Март 28, 2018, 14:46
Добрый день уважаемые форумчане. Купил в Китае принтер штрих кодов xprinter -360 мне нужно печатать простой текст. Для этого я текст записываю в QTextEdit->setHtm и вывожу на печать. Почему то слова раскидываются на несколько страниц, каждое слово на одну страницу. Такое ощущение как будто не выставлены границы страницы,хотя при печати QPrintPageDialog я ставил минимальные границы. Может как то нужно настраивать QTextEdlt Непонимающий??
14  Qt / Вопросы новичков / Re: QSystemTrayIcon сворачивание окон : Ноябрь 02, 2017, 13:08
Разобрался сам
Код:
MySystemTray::MySystemTray(QWidget* pwgt):QLabel("<H1>GLab</H1>",pwgt)
    
{
     window= new MainWindow;
     window->show();
}


Не нужно указывать родителя. Теперь другой вопрос, нужно ли удалять экземпляр window при закрытии приложения qApp quit(). ? Или он автоматически удалится ?
15  Qt / Вопросы новичков / Re: QSystemTrayIcon сворачивание окон : Ноябрь 02, 2017, 05:46
Цитировать
А где код сворачивания окна? 
MainWindows унаследована от QMainWindows
Страниц: [1] 2 3 ... 7

Страница сгенерирована за 0.056 секунд. Запросов: 23.