Здравствуйте знатоки Qt. У меня проблема - не работает прокрутка в QGraphicsView. Прокрутка вообще не реагирует ни на что. Выкладываю сразу проект. Постарался все подробно расписать в комментариях.
| Код | // main.cpp - тут все понятно #include "MainWindow.h" #include <QApplication>
int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow win; win.show(); return a.exec(); }
|
| Код | // MainWindow.h - описание главного окна системы #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QGraphicsScene> #include <QGraphicsView> #include "centralwidget.h" #include "linelayout.h"
class MainWindow : public QMainWindow { public: MainWindow(QWidget* parent = 0);
private: CentralWidget* m_pCentralWidget; LineLayout* m_pLayout;
QGraphicsView* m_pView; QGraphicsScene* m_pScene;
HorizLinear* m_pHoriz; QWidget* m_pCentral; }; #endif // MAINWINDOW_H
|
| Код | // MainWindow.cpp - реализация главного окна системы #include "MainWindow.h" #include <QScrollBar>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { m_pHoriz = new HorizLinear(this); // создаем класс горизонтальной линейки m_pScene = new QGraphicsScene(QRectF(0,0,2000,2000),this); m_pView = new QGraphicsView( m_pScene, this); // создаем класс вида сцены m_pView->centerOn(0,0);
// создаем класс центрального виджета главного окна m_pCentralWidget = new CentralWidget(m_pHoriz, m_pView);
setCentralWidget(m_pCentralWidget); setWindowTitle("Диаграмма"); setGeometry(100,100,700,500); }
|
| Код | // файл centralwidget.h описание центрального виджета главного окна #ifndef CENTRALWIDGET_H #define CENTRALWIDGET_H
#include <QWidget> #include "Linear.h" #include "linelayout.h" #include <QGraphicsView> // класс центрального виджета для главного окна (MainWindow) class CentralWidget : public QWidget { Q_OBJECT
public: CentralWidget(HorizLinear* pHoriz, QGraphicsView* pCentral, QWidget* pParent = 0); ~CentralWidget(); private: LineLayout* m_pLayout; };
#endif // CENTRALWIDGET_H
|
| Код | // файл centralwidget.cpp реализация центрального виджета главного окна #include "centralwidget.h" #include <QScrollBar>
CentralWidget::CentralWidget(HorizLinear *pHoriz, QGraphicsView* pCentral, QWidget *pParent) : QWidget(pParent) { m_pLayout = new LineLayout(this);
// добавляем элементы в пользовательский Layout m_pLayout->addWidget(pHoriz , LineLayout::Horline); m_pLayout->addWidget(pCentral, LineLayout::Center );
// создаем соединение линеки прокрутки объекта класса QGraphicsView со слотом объекта класса HorizLinear // (который почему-то не отрабатывает) connect(pCentral->horizontalScrollBar(),SIGNAL(valueChanged(int)),pHoriz,SLOT(slotScrollBarValue(int)));
setLayout(m_pLayout); }
CentralWidget::~CentralWidget() {
}
|
| Код | // linelayout.h - содержит описание класса пользовательского layout используемого в классе CentralWidget #ifndef LINELAYOUT_H #define LINELAYOUT_H #include <QLayout> #include "Linear.h"
// класс компоновщика виджетов class LineLayout : public QLayout { Q_OBJECT
public: enum Pos { Horline = 1, Center = 3 };
LineLayout(QWidget* parent = 0);
virtual void addItem(QLayoutItem* item); void addWidget(QWidget *w, Pos position);
virtual QLayoutItem* itemAt(int index) const; virtual int count() const; virtual QLayoutItem* takeAt(int index); virtual QSize sizeHint() const; Qt::Orientations expandingDirections() const;
void setGeometry(const QRect &rect);
QSize minimumSize();
private:
QLayoutItem* m_pHoriz; QLayoutItem* m_pCentral;
int m_nIndent; }; #endif // LINELAYOUT_H
|
| Код | // linelayout.cpp - содержит реализацию класса пользовательского layout используемого в классе CentralWidget #include "linelayout.h" LineLayout::LineLayout( QWidget *parent) : QLayout(parent) , m_nIndent(30) { setSpacing(0); setMargin(0); }
void LineLayout::addItem(QLayoutItem *item) { // данная ф-ция не используется Q_UNUSED(item); return; } // добавление виджета в пользовательский Layout void LineLayout::addWidget(QWidget *w, Pos position) { QLayoutItem* item = new QWidgetItem(w); switch(position) { case(Horline) : m_pHoriz = item; break; case(Center ) : m_pCentral = item; break; } }
QLayoutItem* LineLayout::itemAt(int index) const { switch(index) { case(1) : return m_pHoriz ; case(3) : return m_pCentral; } return 0; }
int LineLayout::count() const { return 2; }
QLayoutItem* LineLayout::takeAt(int index) { if(index < 0 || index >= count()) return 0; return itemAt(index); }
QSize LineLayout::sizeHint() const { return QSize(m_nIndent*3,m_nIndent*3); }
QSize LineLayout::minimumSize() { return QSize(m_nIndent*3,m_nIndent*3); }
Qt::Orientations LineLayout::expandingDirections() const { return Qt::Horizontal | Qt::Vertical; }
void LineLayout::setGeometry(const QRect &rect) { m_pHoriz->setGeometry(QRect( 0, 0, rect.width(), m_nIndent)); m_pCentral->setGeometry(QRect(0, m_nIndent, rect.width(), rect.height()-m_nIndent)); }
|
| Код | // linear.h описание класс "линейки" используемой в центральном виджете #ifndef LINEAR_H #define LINEAR_H #include <QWidget> #include <QPaintEvent>
// класс горизонтальной линейки class HorizLinear : public QWidget { Q_OBJECT public: HorizLinear( QWidget* parent = 0); // конструктор
public slots: void slotScrollBarValue(int a); // слот реагирования на изменение полосы прокрутки
protected: virtual void paintEvent(QPaintEvent *event); // событие перерисовки объекта };
#endif // LINEAR_H
|
| Код | // linear.cpp реализация класса "линейки" используемой в центральном виджете #include "Linear.h" #include <QPainter> #include <QDebug>
//================================================================ // реализация класса горизонтальной линейки HorizLinear::HorizLinear(QWidget *parent) : QWidget(parent) {}
// этот код работает нормально и к вопросу не имеет никакого значения void HorizLinear::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); int nHeight1 = height()*0.67; int nHeight2 = height(); int nHeight3 = height()*0.5;
int offSet = 4; int counter = 1;
QString str; painter.drawLine(0,0,0,nHeight2); painter.setFont(QFont("Arial",6,QFont::Normal)); for(int i = offSet; i < width(); i+=4) { if(counter%10 == 0) { painter.drawLine(i,0,i,nHeight2); str.setNum(counter/10); painter.drawText(i+2,8,str); } else if(counter%5 == 0) painter.drawLine(i,nHeight3,i,nHeight2); else painter.drawLine(i,nHeight1,i,nHeight2);
counter++; } }
// просто хотим проверить вызов слота void HorizLinear::slotScrollBarValue(int a) { qDebug() << "slotScrollBarValue" << a; }
|
З.Ы. Не нашел значка прикрепления файла. Можно ли как-нибудь выложить архив проекта
|