2013-07-02 5 views
0

Опишу свою проблему.Qt QGraphicsView: отображение QGraphicsView внутри вкладки

У меня есть класс для вкладки, которая выглядит примерно так:

class Tab : public QWidget 
{ 
public: 
    Tab(); 
    ... 
private: 
    ... 
    QGraphicsView *view; 
    ... 
}; 

В Tab() я создаю view. Теперь в моем главном окне я хотел бы иметь QTabWidget, который содержит некоторые вкладки, где каждая вкладка отображает QGraphicsView. Это выглядит примерно так:

class MainWindow : QMainWindow 
{ 
public: 
    MainWindow(); 
    ... 
private: 
    ... 
    QTabWidget *tabWidget; 
    ... 
}; 

и

MainWindow::MainWindow() 
{ 
    tabWidget = new QTabWidget(this); 
    tabWidget->addTab(new Tab, tr("tab 1")); 
    tabWidget->addTab(new Tab, tr("tab 2")); 

    setCentralWidget(tabWidget); 
} 

Это не отображает QGraphicsView с в закладках. Для того, чтобы QGraphicsView s видно, я бы написать что-то вроде этого:

MainWindow::MainWindow() 
{ 
    tabWidget = new QTabWidget(this); 
    tab1 = new Tab; 
    tab2 = new Tab; 
    tabWidget->addTab(tab1->view, tr("tab 1")); 
    tabWidget->addTab(tab2->view, tr("tab 2")); 

    setCentralWidget(tabWidget); 
} 

view и должны быть открытыми в классе Tab, который действительно выглядит плохо. Класс Tab имеет некоторые частные функции, которые используются для построения view, и я не хочу, чтобы view был общедоступным в Tab.

Как обойти это?

Я думал о создании класса, который наследует от QGraphicsView и добавляет мои собственные функции, но я не совсем уверен, как это сделать, чтобы он работал для меня.

Благодарим за ответы и комментарии.

ответ

0

Это, скорее всего, потому, что Tab не имеет макета (или вы даже не добавили view в качестве ребенка Tab виджета). Вы не указали конструктор Tab, так что я точно не знаю.

Если вкладка может содержать только представление, тогда вам необходимо получить Tab класс от QGraphicsView вместо QWidget. Дополнительный номер view должен быть удален, и вы можете использовать объекты Tab, как если бы это было QGraphicsView объектов.

Если вкладка может содержать другие виджеты, то вы должны добавить макет к объекту Tab и добавить к нему этот вид и других детей. Пример:

Tab::Tab() { 
    QVBoxLayout* main_layout = new QVBoxLayout(this); 
    view = new QGraphicsView(); 
    main_layout->addWidget(view); 
} 
+0

Да! Работает с макетом. Я просто не понимаю, как это работает. Можете ли вы дать мне ссылку на какой-то текст, где я могу прочитать об этом? Спасибо. – pizet

+0

Для начала: http://qt-project.org/doc/qt-4.8/layout.html –

Смежные вопросы