Qt - wykorzystanie argumentów funkcji main do otwierania pliku

Stronę tą wyświetlono już: 13 razy

Każdy z nas na co dzień korzysta z różnych programów i otwiera różne pliki klikając dwukrotnie na ikonkę, ale jak to jest zrobione i jak to zrobić, aby takie coś działało w utworzonym własnoręcznie programie? Odpowiedź jest dość prosta, albowiem w pliku main.cpp znajduje się funkcja, która jest wywoływana przez system i ta funkcja przyjmuje dwa argumenty:

  • int argc - określa liczbę elementów tablicy ciągu znaków podanej jako kolejny argument;
  • char* argv[] - zawiera parametry, z jakimi program został uruchomiony (w formie tablicy ciągów znaków)

Bazując na projekcie rozpoczętym na stronie Programowanie → Qt Creator GUI → Qt - kontrolka QTextEdit można lekko modyfikując kod funkcji main wyświetlić te parametry:

Listing 1
  1. int main(int argc, char *argv[])
  2. {
  3. for(int i = 0; i < argc; i++){
  4. qDebug() << argv[i]; // to zostanie wyświetlone w konsoli Qt Creatora
  5. }

W konsoli Qt Creator-a zostanie wyświetlone coś w stylu: "C:\...\build-myFirstGUI-Desktop_Qt_5_6_3_MinGW_32bit-Debug\debug\myFirstGUI.exe, czyli pierwszym i jedynym domyślnie elementem tablicy argv jest ścieżka do uruchomionego programu, następne elementy to parametry uruchomieniowe programu. Ja zakładam, że parametrami tymi będzie ścieżka do otwieranego pliku tekstowego.

W związku z powyższym konieczne jest zmodyfikowanie konstruktora klasy MainWindow tak, aby ten przyjmował jako argumenty wyżej wymienione parametry funkcji main:

Listing 2
  1. explicit MainWindow(int argc, char *argv[], QWidget *parent = 0);</strong>
  2. <p>W pliku <strong>mainwindow.cpp</strong> w konstruktorze klasy <strong class="Qt Cpp val_type">MainWindow</strong> konieczne jest obsłużenie wczytywania pliku z wykorzystaniem parametrów funkcji <strong class="Qt Cpp function">main</strong>:</p>
  3. <code>if(argc > 1){
  4. openFile(argv[1]);
  5. }

Metodę openFile należy utworzyć:

Listing 3
  1. void MainWindow::openFile(QString filePath){
  2. QFile readFile(filePath);
  3. QFileInfo fileInfo(filePath);
  4. QString extension = fileInfo.suffix();
  5. if(readFile.exists()){
  6. if(readFile.open(QIODevice::ReadOnly | QIODevice::Text)){
  7. QTextStream read(&readFile);
  8. read.setCodec("UTF-8");
  9. if(extension == "txt"){
  10. ui->edit->setText(read.readAll());
  11. }else if(extension == "ftf"){
  12. ui->edit->setHtml(read.readAll());
  13. }
  14. readFile.close();
  15. }
  16. }
  17. QTextCursor cursor = ui->edit->textCursor();
  18. cursor.movePosition(QTextCursor::End);
  19. ui->edit->setTextCursor(cursor);
  20. }

i jednocześnie zmienić kod sygnału on_actionOpen_triggered:

Listing 4
  1. void MainWindow::on_actionOpen_triggered()
  2. {
  3. QString filePath = QFileDialog::getOpenFileName(
  4. this, // wskaźnik na rodzica (może być 0, gdy rodzica nie ma)
  5. "Open text file", // Text belki tytułowej okna dialogowego
  6. QDir::homePath(), // ścieżka startowa
  7. "All txt files (*.txt *.ftf);;Txt files (*.txt);;Formatted tekxt file (*.ftf)" // filtr plików
  8. );
  9. openFile(filePath);
  10. }

Po wprowadzeniu powyższych zmian wystarczy w systemie wskazać jako program uruchomieniowy swój wypasiony edytor tekstu aby program otwierany plik został wyświetlony w twoim programie.

Komentarze