quinta-feira, 24 de julho de 2014

Criar um menu de Recent Files no Qt.

Olá pessoal,



Ando ocupado no emprego, mas como desenvolvi alguns programas para facilitar as coisas no trabalho, estou postando dicas que usei nesses programas. Segue mais um abaixo ;-)


A biblioteca do Qt anda muito bem, gosto muito desse framework. Estava lendo algumas notícias relacionadas a desenvolvimento e me deparei com um componente chamado QSettings, na hora me veio a ideia de utiliza-lo, pesquisei na net e descobri algumas pessoas já fazendo uso. Segue abaixo meu código:

Primeiro, o QSettings usa arquivos .ini para guardar informações do formulário e recuperá-los. Por tanto criei uma lista dos ultimos arquivos abertos:

QAction *separatorAct;
enum { MaxRecentFiles = 10 };

QAction *recentFileActs[MaxRecentFiles];


Segundo, criei duas funções para guardar e recuperar essas info do arquivo .ini:

Recuperar:
void MainWindow::updateRecentFileActions()
{
    QSettings settings("demosetting.ini", QSettings::IniFormat);
    QStringList files = settings.value("recentFileList").toStringList();
    //qDebug() << "carregando de settings: " << files;
    int numRecentFiles = qMin(files.size(), (int)MaxRecentFiles);

    for (int i = 0; i < numRecentFiles; i++) {
        QString text = QString("&%1 %2").arg(i).arg(files[i]);
        recentFileActs[i]->setText(text);
        recentFileActs[i]->setData(files[i]);
        recentFileActs[i]->setVisible(true);
    }

}

Guardar:
void MainWindow::setCurrentFile(const QString &fileName)
{
    //curFile = fileName;
    setWindowFilePath(fileName);

    QSettings settings("demosetting.ini", QSettings::IniFormat);
    QStringList files = settings.value("recentFileList").toStringList();
    files.removeAll(fileName);
    files.prepend(fileName);
    while (files.size() > MaxRecentFiles)
        files.removeLast();

    settings.setValue("recentFileList", files);
    //qDebug() << "salvando em " << settings.fileName() << ": " << files;

}

E o código para adicionar o menu "Recent files":

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // recent files
    QMenu *r = this->menuBar()->addMenu("Recent files");

    for (int i = 0; i < MaxRecentFiles; i++) {
        recentFileActs[i] = new QAction(this);
        recentFileActs[i]->setVisible(false);
        connect(recentFileActs[i], SIGNAL(triggered()), this, SLOT(openRecentFile()));
    }
    for (int i = 0; i < MaxRecentFiles; ++i)
        r->addAction(recentFileActs[i]);
    updateRecentFileActions();
    separatorAct = r->addSeparator();

}

void MainWindow::openRecentFile()
{
    QAction *action = qobject_cast<QAction *>(sender());
    if (action)
        loadFile(action->data().toString());

}

Implementem a função loadFile() ou substitua a chamada pela sua função e lembrando que estou usando o Qt versão 5.2 (no Qt Creator 3.1.1).
Espero ter ajudado novamente.

Até a próxima

Abç, Emanuel

Nenhum comentário:

Postar um comentário