2017-03-09 2 views
1

QDockWidget에 QTreeView를 추가하는 간단한 예가 있습니까 (잘하면 C++에서)? swatch1이 QDockWidget에서 유형 인 경우QTreeView를 QDockWidget에 추가 할 수 있습니까?

QFile file(":/default.txt"); 
file.open(QIODevice::ReadOnly); 
TreeModel model(file.readAll()); 
file.close(); 

QTreeView w; 
w.setModel(&model); 
w.setWindowTitle(QObject::tr("Simple Tree Model")); 

QGridLayout  *layout; 
layout = new QGridLayout; 
layout->addWidget(&w, 0, 0, 1, 3); 
swatch1->setLayout(layout); 

:

나는 같은 중간 개체로 QLayout 사용하려고했습니다. 내 코드는 실행되지만 DockWidget에는 트리가 표시되지 않습니다.

QTreeWidget 예제를 보았지만 트리 뷰가 자주 변경되므로 QTreeView를 사용하는 것을 선호합니다.

누구나 QTreeView를 QDockWidget에 배치하는 방법에 대한 간단한 예를 제공 할 수 있습니까? 감사합니다

+1

귀하의 프로그램이이 코드 스 니펫의 범위를 벗어나면 w 및 모델이 삭제되고 그 수명이 다 된 것으로 보입니다 . 이것을 피하려면 다음을 수행해야합니다. TreeModel * model = new TreeModel (..); QTreeView * w = 새로운 QTreeView; –

답변

0

QDockWidget::setWidget을 사용하여 도크 창의 내용을 설정할 수 있습니다. 당신의 DockWidget입니다 swatch1, 그래서 만약

QWidget* container = new QWidget; 
dock->setWidget(container); 

QLayout* layout = new QHBoxLayout; 
container->setLayout(layout); 

QTreeView* treeView = new QTreeView; 
layout->addWidget(treeView) 
0

QDockWidget이는 QWidget입니다 : 당신이 도크에서 레이아웃 내에서 나무를하고 싶었 경우

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    QDockWidget* dock = new QDockWidget; 
    setCentralWidget(dock); 

    QTreeView* treeView = new QTreeView; 
    dock->setWidget(treeView); 

    QFileSystemModel* treeModel = new QFileSystemModel; 
    treeModel->setRootPath(QDir::currentPath()); 
    treeView->setModel(treeModel); 
} 

또는 예를 들어, 다음과 같이 사용할 수 있습니다 :

QMainWindow mw; 
QTreeView *w = new QTreeView(&mw); 
QDockWidget *swatch1 = new QDockWidget("Simple Tree Model", &mw); 
swatch1->setWidget(w); 
// addDockWidget is a method of QMainWindow 
mw.addDockWidget(Qt::RightDockWidgetArea, swatch1); 
1

제이, 여기에 조금을 추가하고 싶습니다. 첫 번째 제안 코드 :

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    QDockWidget* dock = new QDockWidget; 
    setCentralWidget(dock); 

    QTreeView* treeView = new QTreeView; 
    dock->setWidget(treeView); 

    QFileSystemModel* treeModel = new QFileSystemModel; 
    treeModel->setRootPath(QDir::currentPath()); 
    treeView->setModel(treeModel); 
} 

나는 비슷한 것을 시도했다. 그러나 컴파일하는 동안 dock-> setWidget (treeView)이 실패했으며 허용되지 않는다는 오류 메시지가 표시됩니다. QTreeView가 위젯이기 때문에 이해할 수 없었습니다. 왜 이것이 허용되지 않는 것입니까? 또는 예를 들어 컴파일을 통과 한 QTreeWidget 항목에 대해 dock-> setWidget (treeWidget)을 시도했습니다.

+0

"dock-> setWidget (treeView)이 실패했으며 이것이 허용되지 않는다는 오류 메시지가 있습니다". 어떤 오류 메시지가 나타 납니까? 컴파일시 또는 런타임시? –

1

문제가 해결되었습니다.

Qt Code: Switch view 
QTreeView w; 
w.setModel(&model); 
swatch1->setWidget(&w); 
w.setEnabled(true); 

코드는 객체 메소드의 범위에 : 이것은 내 원래의 코드입니다. 스택에서 생성 된 QTreeView 인스턴스는 메소드가 종료 되 자마자 파괴되어 Dock 위젯에서 제거됩니다. 그것이 코드가 실행되는 이유이며, 트리를 볼 수 없습니다.

티보 B 및 제이, 두 분 모두 매우 감사드립니다. 귀하의 게시물은 내가 작성한 코드가 정확하다는 것을 확인하지만 다른 것은 잘못된 것입니다 ...

관련 문제