[Qt][C++]Ustawienie swojego programu jako domyślnego do otwierania plików .txt

0
void NotepadWindow::on_actionOpen_triggered()
{
    QString file = QFileDialog::getOpenFileName(this, "open"); // Otwórz okienko wyboru plików
    if(!file.isEmpty())        // Jeśli plik nie jest pusty
    {
        QFile sFile(file);
        if(sFile.open(QFile::ReadOnly | QFile::Text)) // Jeśli plik jest otwarty
        {
            mFilename = file;
            QTextStream in(&sFile);
            QString text = in.readAll();
            sFile.close();
            ui->textEdit->setPlainText(text);
        }
    }

Powyższy kod odpowiada u mnie za otwieranie plików po naciśnięciu przycisku "otwórz". Chciałbym, abym mógł również otwierać pliki bezpośrednio, naciskając na plik tekstowy i "otwórz za pomocą". Wiem jedynie, że trzeba coś kombinować z int main(int argc, char *argv[]), ale zielonego pojęcia nie mam jak się za to zabrać. Pomożecie?

0

Tak łatwo to tego nie zrobisz, to chyba trzeba pokombinować z rejestrem systemowym windowsa (chyba że używasz inny system) i zarejestrować tam taką usługę do twojego programu. Musiałbyś to zrobić chyba poprzez WinAPI.

0

Nie trzeba nic rejestrować (chociaż można), bo w oknie „otwórz za pomocą” można wybrać dowolny EXE na dysku do uruchomienia.

Z poziomu programu dostajesz ścieżkę do wybranego pliku w argv[1].

#include <stdio.h>
int main(int argc, char *argv[])
{
	printf("%d\n", argc);
	if (argc == 2)
		printf("%s\n", argv[1]);
}

argc to ilość podanych argumentów. Argument jest zawsze co najmniej jeden argv[0], w którym jest ścieżka do pliku EXE.

Informacji jak zarejestrować nasz program by się pojawiał domyślnie w oknie „otwórz za pomocą” szukałbym tutaj:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb776778%28v=vs.85%29.aspx
Uprzedzam że nie robiłem tego z poziomu kodu.

Począwszy od którejś wersji (8? 10?) nie da się już prosto dodać wartości do rejestru by wymusić otwarcie dokumentu w naszym programie. System i tak za pierwszym razem wyświetli okienko „otwórz za pomocą”, co najwyżej z naszym programem wybranym jako domyślnym.

0

Wolałbym to zrobić z poziomu kodu, lecz nie bardzo wiem jak przełożyć kod z języka C na swój program w C++ przy użyciu Qt.

0

Najbardziej profesjonalnie to będzie jeśli ustawianie z poziomu instalatora. Takie operacje mogą wymagać przecież uprawnień administratora. Co więcej jak powiązania z rozszerzeniem wykona instalator to w przypadku odinstalowania usunie on również powiązanie z typem pliku.

1
Alsenass napisał(a):

Wolałbym to zrobić z poziomu kodu, lecz nie bardzo wiem jak przełożyć kod z języka C na swój program w C++ przy użyciu Qt.

Masz funkcję main w swoim programie? Masz. To w czym problem? ;-)

0
Azarien napisał(a):
Alsenass napisał(a):

Wolałbym to zrobić z poziomu kodu, lecz nie bardzo wiem jak przełożyć kod z języka C na swój program w C++ przy użyciu Qt.

Masz funkcję main w swoim programie? Masz. To w czym problem? ;-)

Wohoho, jaki śmieszek.

#include "notepadwindow.h"
#include <QApplication>
#include "ui_notepadwindow.h"
#include <QFileDialog>



int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    NotepadWindow w;
    w.show();
    return a.exec();
    if(argc == 2)
    {
        QFile file(argv[1]);
        QTextStream in(&file);
        QString text = in.readAll();
        ui->textEdit->setText(text);
        file.close();
    }

}

jakoś nie działa :)

0

http://www.thewindowsclub.com/remove-click-context-menu-items-editors
dodajesz swoj program tam z argumentem i rob co chcesz

1
Alsenas napisał(a):
Azarien napisał(a):
Alsenass napisał(a):

Wolałbym to zrobić z poziomu kodu, lecz nie bardzo wiem jak przełożyć kod z języka C na swój program w C++ przy użyciu Qt.

Masz funkcję main w swoim programie? Masz. To w czym problem? ;-)

Wohoho, jaki śmieszek.

#include "notepadwindow.h"
#include <QApplication>
#include "ui_notepadwindow.h"
#include <QFileDialog>



int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    NotepadWindow w;
    w.show();
    return a.exec();
    if(argc == 2)
    {
        QFile file(argv[1]);
        QTextStream in(&file);
        QString text = in.readAll();
        ui->textEdit->setText(text);
        file.close();
    }

}

jakoś nie działa :)

No pewnie, to poniższe też "nie działa", ciekawe dlaczego?

#include <iostream>

int main()
{
    return 0;
    std::cout << "hehe\n";
}
0

Może dlatego, że to mój pierwszy program w Qt i mam pierwszy raz doczynienia z "argv" i "argc", a wasze kody w C pomimo tego, że są zrozumiałe, to w ogóle nie ułatwiają mi wdrożenia tego.

"ui was not declared in this scope".

0

Tyle wystarczy w C++, żeby dodać program jako domyślnie otwierający plik!

#include <iostream> 

using namespace std; 

int main(int argc, char *argv[])
{
    cout << argc << endl;
    cout << argv[0] << endl;
    cout << argv[1] << endl;
}

Powiedzcie mi co robię źlę!

main.cpp


#include "notepadwindow.h"
#include <QApplication>



int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    NotepadWindow w;
    if(argc == 2)
    {
        QString textfile = argv[1];
        w.openfile(textfile);
    }

    w.show();
    return a.exec();

}

NotepadWindow.cpp

void NotepadWindow::openfile(QString textfile)
{
    QFile file(textfile);
    QTextStream in(&file);
    in.setCodec("UTF-8"); // Ustaw kodowania znaków na UTF-8
    QString text = in.readAll();
    ui->textEdit->setPlainText(text);
}

0
#include "notepadwindow.h"
#include <QApplication>
#include <QCoreApplication>


int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    NotepadWindow w;
    if(argc == 2)
    {
        w.openfile(QCoreApplication::arguments().at(1));
    }

    w.show();
    return a.exec();

}



Również nic się nie dzieje - notatnik się otwiera, a w środku pusto. Plik tekstowy, który chcę otworzyć zawiera tekst.

Dodatkowo edytowałem Notepadwindow.cpp

void NotepadWindow::openfile(QString textfile)
{
    QFile file(textfile);
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    QTextStream in(&file);
    in.setCodec("UTF-8"); // Ustaw kodowania znaków na UTF-8
    QString text = in.readAll();
    ui->textEdit->setPlainText(text);
    file.close();
}
0
Alsenas napisał(a):

Również nic się nie dzieje - notatnik się otwiera, a w środku pusto. Plik tekstowy, który chcę otworzyć zawiera tekst.

Ale to Ty masz pełen kod. Odpal debugger i zobacz jak kod się wykonuje i z łatwością sprawdzisz co jest nie tak. Nikt tego za Ciebie nie zrobi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1