Programowanie C++ Qt4 w systemie Gnu-Linux/Własny widget - dziedziczenie

Z Wikibooks, biblioteki wolnych podręczników.

Prosty widget przeglądarki plików[edytuj]

Na początek mocno okrojona przeglądarka plików oparta na:

  1. Klasa dziedziczy po QDockWidget
  2. Klasa ma własny pasek narzędzi
  3. W klasie umieścimy Przykładowy przycisk w pasku narzędzi "home"
  4. Podwójne kliknięcie na item w widgecie QTreeView spowoduje
    1. Zmianę folderu głównego w widgecie QTreeView (jeśli kliknięty folder)
    2. Wyemitowanie sygnału z informacjami o pliku (jeśli kliknięty plik)

Plik nagłówkowy naszej klasy[edytuj]

#ifndef FILEBROWSER_H
#define FILEBROWSER_H

#include <QWidget>
#include <QDockWidget>
#include <QTreeView>
#include<QToolBar>
#include <QAction>
#include<QFileInfo>
#include <QFileSystemModel>




/* Dziedziczenie po klasie QDockWidget - Dodajemy kilka elementów
 * Pasek narzędzi z jednym przyciskiem home
 * obiekt QTreeView do wyświetlania drzewa katalogów
 * Dodajemy jeden sygnał emitowany w momencie podwójnego kliknięcia (jeśli kliknięty item jest plikiem
 *
 *
 */
class FileBrowser : public QDockWidget
{
    Q_OBJECT

    QTreeView* TreeFileWindow;      //wyświetlanie drzewa katalogów 
    QToolBar* toolbar;              //pasek narzędzi
    QAction *home;                  //przycisk home
    QFileSystemModel *DirModel;

    inline void toolBarCreate();
    inline void treViewWidgetCreate();

/*funkcja ustawiająca folder główny w obiekcie QTreeView
Funkcja pomocnicza, żeby długo nie pisać
*/
   void ViewRootFolderSet(QString path){TreeFileWindow->setRootIndex(DirModel->setRootPath(path));}


private slots:

    void cd_home() {ViewRootFolderSet("/home");} //przejdź do folderu domowego

    void TreeFileWindowDoubeCliked(const QModelIndex &index);//podwójne kliknięcie

public:

    explicit FileBrowser(QWidget *parent = 0);

signals:
   void cliked(const QFileInfo &plik);

public slots:


};

#endif // FILEBROWSER_H

Plik implementacji[edytuj]

#include "filebrowser.h"
#include<QHeaderView>

FileBrowser::FileBrowser(QWidget *parent) :
    QDockWidget(parent)
{

  toolBarCreate();          // funkcja kreująca pasek narzędzi naszego widgeta
  treViewWidgetCreate();    // instrukcje związane z tworzeniem widgeta do wyświetlania drzewa katalogowego
  connect(TreeFileWindow, SIGNAL (doubleClicked(QModelIndex)), this, SLOT(TreeFileWindowDoubeCliked(QModelIndex)));
  connect(home,SIGNAL(triggered()), this, SLOT(cd_home()));

}




void FileBrowser::TreeFileWindowDoubeCliked(const QModelIndex &index)
{

    if (DirModel->isDir(index)) TreeFileWindow->setRootIndex(index); //Jeśli folder to zmień folder nadrzędny
        else
        emit cliked(DirModel->fileInfo(index));                      //Jeśli plik

}


void FileBrowser::toolBarCreate()

{
    toolbar=new QToolBar(this);
    home=new QAction(QIcon::fromTheme("go-home"),"home",this);
    toolbar->addAction(home);
    setTitleBarWidget(toolbar);

}
void FileBrowser::treViewWidgetCreate()
{
    TreeFileWindow=new QTreeView(this);
    setWidget(TreeFileWindow);
    DirModel=new QFileSystemModel(this);
    TreeFileWindow->setModel(DirModel);
    TreeFileWindow->hideColumn(3);
    TreeFileWindow->hideColumn(2);
    TreeFileWindow->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
    TreeFileWindow->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
}

Prosty program demonstrujący[edytuj]

Żeby klasę zaprezentować potrzeba trochę kodu przykładowego. Należy w tym celu w QtCreator stworzyć szablon programu z oknem głównym. A następnie umieścić na formatce wiget typu QTextEdit. Poniżej przedstawię jakich zmian należy dokonać aby zobaczyć nowo utworzony widget w akcji:

Zmodyfikowany pliki nagłówkowy[edytuj]

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<filebrowser.h>                       //1 Dodajemy plik nagłówkowy

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    FileBrowser* m_FileBrowser;              //2 Deklarujemy wskaźnik do naszego wegeta z przeglądarką plików

private slots:
    void FileToOpen(const QFileInfo &file);  //3 Deklarujemy Slot. Będzie wywołany automatycznie gdy nastąpi podwójne kliknęcie na plik 


};

#endif // MAINWINDOW_H

Plik implementacji klasy okna głównego[edytuj]

Przykładowy krótki plik implementacji. Dodatkowe wyjaśnienia raczej zbędne

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_FileBrowser = new FileBrowser(this);                                               //tworzenie widgeta
    addDockWidget(Qt::LeftDockWidgetArea,m_FileBrowser);                                 //Dokowanie widgeta
    connect(m_FileBrowser,SIGNAL(cliked(QFileInfo)),this,SLOT(FileToOpen(QFileInfo)));   //połączenie sygnału widgeta ze slotem aplikacji  
} 

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

/* Tylko dla przykładu wyświetlimy pełną ścieżkę do pliku który został podwójnie kliknięty. 
 * Jest to slot aplikacji wywołany automatycznie gdy nastąpi podwójne kliknięcie na pliku w widgecie m_FileBrowser
 */
void MainWindow::FileToOpen(const QFileInfo &file)
{
   ui->textEdit->setText(file.absolutePath()); 

}

Do pobrania klasa + program testowy[edytuj]

http://chomikuj.pl/mysiadziura/www.marekk.dreamhosters.com/TestFileBrowser.tar,4795170157.gz(archive)


Ciut Bardziej rozbudowany widget w Akcji:


https://www.youtube.com/watch?v=vSuO_LP7ODg