2011-01-19 13 views
5

Tôi đang cố gắng để mở một tập tin xml trong vị trí hiện tại của thực thiQt cách mở tệp trong thư mục hiện tại? hoặc có chuyện gì với điều này?

 QString path = QDir::currentPath(); 
     path.append("/acc.xml"); 
     QFile file(path); 

     if(!file.open(QIODevice::ReadOnly)) 
     { 
      insertItem("IO ERR"); 
     } 
  • Khi tôi chạy nó từ Qt tác giả, mọi thứ hoạt động. currentPath() trả về đường dẫn đến thư mục của thực thi

  • Khi tôi đi đến project-build-desktop/ thư mục và cố gắng chạy nó bằng tay currentPath() lợi nhuận /home/user/Documents

EDIT

cũng đã cố gắng với kết quả tương tự:

Qt::current().path(); 
Qt::current().absolutePath(); 
+1

Sự cố rõ ràng xuất phát từ đường dẫn của tài liệu. –

+0

Cách chính xác là gì? Tôi đã dành gần 2 giờ để cố gắng tìm ra/hiểu Qt – sdadffdfd

Trả lời

2

Chec k giá trị trả về của QDir::currentPath(). Tôi nghĩ rằng khi bạn chạy từ Qt Creator, nó sẽ trả về đường dẫn nơi tệp dự án (* .pro) được đặt. Khi bạn chạy từ bên ngoài, bạn sẽ nhận được đường dẫn của nhị phân.

Sửa

tôi không bao giờ làm việc với Linux. Tuy nhiên, bạn có thể thử các chức năng khác/kết hợp từ QDir:.

  • QDir :: hiện tại() đường dẫn()
  • QDir :: hiện tại() absolutePath()

, vv

.
+0

từ bên ngoài đó là '/ home/user/Documents'. Nhưng thực thi tôi đang chạy rõ ràng là không có ... – sdadffdfd

+0

Tôi thực sự cần đường dẫn đến nhị phân ... và điều đó không xảy ra khi tôi chạy nó từ bên ngoài – sdadffdfd

+0

@Vic .: Vui lòng kiểm tra chỉnh sửa. – Donotalo

2

Để mở một tập tin trong thư mục hiện tại, bạn chỉ cần gọi QFile constructor

tôi thử nghiệm này trên máy tính Linux của tôi và nó hoạt động

#include <QtCore> 

int main(int argc, char** argv){ 
    QFile some_file("test.xml"); 
    if(!some_file.open(QIODevice::ReadOnly | QIODevice::Text)){ 
     qDebug() << "Unable to open file"; 
    } else { 
     qDebug() << "File open successfully"; 
    } 
    exit(-1); 
} 

Tôi chạy ./TestQFile và nếu có tệp test.xml trong thư mục hiện tại, nó hoạt động.

UPDATE: Tôi nhận thấy rằng cách diễn đạt của câu hỏi của bạn nói rằng bạn muốn các tập tin trong thư mục tương tự như thực thi, điều này có thể được thực hiện như sau:

// Getting directory of the executable 
QFileInfo exec_fileinfo(argv[0]); 
qDebug() << "Executable is in" << exec_fileinfo.absolutePath(); 

UPDATE 2: Dưới bảng dự án QtCreator, có một trường cho Thư mục làm việc. Đây là thư mục được trả về bởi QDir :: currentPath() nếu bạn đang chạy nó thông qua QtCreator.

+0

Tôi đã không sử dụng QtCreator để mã này lên. Bạn có thể cung cấp thêm chi tiết về cấu trúc thư mục của mình và lệnh chính xác mà bạn đã chạy để tạo lại lỗi mở tệp không? –

+0

Dường như QtCreator thực hiện một số loại phép thuật khi chạy dự án của tôi. Đó là một ứng dụng GUI mà tôi đang cố gắng thiết kế. Từ 'bên ngoài' tôi thường chạy ứng dụng mà không có đối số, chỉ cần 'click' – sdadffdfd

+0

Đã cố gắng xem cách QtCreator chạy nó .. chỉ tìm thấy:' Starting/home/user/Projects/Project-build-desktop/Project ... ' – sdadffdfd

1

Tôi đã tìm thấy cuộc thảo luận này trong khi tìm kiếm giải pháp tương tự. Tôi nghĩ rằng cách di động nhất để mở một tệp bên ngoài có tên cố định (và không có hộp thoại và người dùng nào có liên quan) là sử dụng Resource System.

Trong trường hợp của tôi, tôi đã tạo một tệp tài nguyên mới với tiền tố /config và thêm tệp (được gọi là settings.xml). Bên trong mã, tôi không cần phải sử dụng bất kỳ chức năng đường dẫn nào cả. Thay vào đó, tôi sử dụng hệ thống tài nguyên. Vì vậy, một cuộc gọi như QFile file(":/config/settings.xml") hoạt động tốt. Sử dụng QT creator 2.0.1 và QT 4.7 trên Windows.

+0

Để tự nhận xét, giải pháp này hoạt động nhưng có nhược điểm là không thể sửa đổi tệp XML vì nó được chuyển đổi thành tệp tài nguyên nhị phân. Nếu bạn cần để có thể sửa đổi nội dung XML và thực thi ứng dụng mà không cần biên dịch lại, hãy sử dụng một trong các giải pháp còn lại được cung cấp tại đây. – ierax