Просмотр сообщений
|
Страниц: [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(); }
|
|
|
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
|
|
|
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));
}
|
|
|
7
|
Qt / Базы данных / QSqlTableModel и QtreeView древовидная структура отображения.
|
: Март 09, 2019, 16:46
|
Добрый день форумчане, задача построить древовидную структуру из СУБД вид: id name parent_id1 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; }
|
|
|
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(). ? Или он автоматически удалится ?
|
|
|
|
|