Programowanie C++ Qt4 w systemie Gnu-Linux/Własny widget - dziedziczenie
Prosty widget przeglądarki plików
edytujNa początek mocno okrojona przeglądarka plików oparta na:
- Klasa dziedziczy po QDockWidget
- Klasa ma własny pasek narzędzi
- W klasie umieścimy Przykładowy przycisk w pasku narzędzi "home"
- Podwójne kliknięcie na item w widgecie QTreeView spowoduje
- Zmianę folderu głównego w widgecie QTreeView (jeśli kliknięty folder)
- 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
edytujPrzykł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
Ciut Bardziej rozbudowany widget w Akcji: