2014-06-22 113 views
2

我有一個Mdi application
此應用程序允許打開subWindow中的文本文件。
問題是你可以多次打開同一個文件。如何防止打開文件兩次?

我用下面的殘缺碼:

QList<QMdiSubWindow*> subWindows = ui->mdiArea->subWindowList() 

但我怎麼能知道,如果文件存在與否。

如何防止此行爲?


修改

我已經做了下面的代碼,這是正常工作:(Please review the code

QList <QMdiSubWindow*> subWindows = ui -> mdiArea -> subWindowList(); 
if (subWindows.count() > 0) { 
    for (int i = 0; i < subWindows.count(); i++) { 
     if (subWindows.at(i) -> property("filePath").toString() == fileDlg) { 
      return; 
     } 
    } 
} 

全碼:

QString fileDlg = QFileDialog::getOpenFileName(this, "Open File", "F://", "Text Files(*.txt)"); 
if (fileDlg != "") { 

    // Start the important code 
    QList < QMdiSubWindow * > subWindows = ui -> mdiArea -> subWindowList(); 
    if (subWindows.count() > 0) { 
     for (int i = 0; i < subWindows.count(); i++) { 
      if (subWindows.at(i) -> property("filePath").toString() == fileDlg) { 
       return; 
      } 
     } 
    } 
    // End the important code 

    QString cache; 
    QFile file(fileDlg); 
    if (file.open(QFile::ReadOnly)) { 
     QTextStream in (& file); 
     while (!file.atEnd()) { 
      cache = in .readAll(); 
     } 
    } 
    file.close(); 


    QFileInfo finfo(file); 
    QWidget * widget = new QWidget(this); 
    QTextEdit * TextEdit = new QTextEdit(widget); 
    TextEdit -> setObjectName("myTextEdit"); 
    QMdiSubWindow * mdiWindows = ui -> mdiArea - > addSubWindow(widget); 
    mdiWindows -> setProperty("filePath", fileDlg); 
    mdiWindows -> setGeometry(5, 5, 300, 250); 
    mdiWindows -> setWindowTitle(finfo.baseName()); 
    mdiWindows -> layout() -> addWidget(TextEdit); 
    mdiWindows -> setWindowState(Qt::WindowMaximized); 
    mdiWindows -> layout() -> setSpacing(0); 
    TextEdit -> setText(cache); 
    mdiWindows -> show(); 
} 
如需要
+1

使用的容器,保持打開的文件的列表,當打開一個新的文件,檢查文件是否打開是打開的文件列表。 – Jichao

+0

謝謝,但有可能給我一個例子。 –

回答

0

示例代碼:

class MdiWindow 
{ 
    static std::vector<std::wstring> s_filePaths; 
    bool openNewFile(const std::wstring& filePath) { 
     std::vector<std::wstring>::iterator iter = std::find(s_filePaths.begin(), s_filePaths.end(), filePath); 
     //already opened 
     if (iter != s_filePaths.end()) { 
      return true; 
     } 
     if (openFileSucceeded(filePath)) { 
      s_filePaths.push_back(filePath); 
      return true; 
     } 
     return false; 
    } 
    void closeFile(const std::wstring& filePath) { 
     s_filePaths.erase(s_filePaths.begin(), std::remove(s_filePaths.begin(), s_filePaths.end(), filePath)); 
    } 
} 
+1

謝謝,但我認爲這段代碼是'C++'而不是'Qt' –

1

根據不同的操作系統上,同一個文件可以有幾個不同的名字。甚至可以用不同的方式引用相同的名稱(想想遍歷目錄結構!)。任何純粹的基於名稱的方案都必然會失敗。

這樣做通常甚至是非常有用的,我經常打開幾次相同的文件,在編輯另一個文件時查看一個地方。讓用戶決定。

0

沒有簡單的方法來做到這一點。它具有平臺相關的解決方案,通過詢問內核數據結構並查看每個進程的結構,這並不容易。

但是,您可以通過應用程序在容器中打開文件,並在打開新文件時檢查它的值。

該容器可以是一個類的成員,如:

QList<QString> openedFileNames; 

打開文件:

if(!openedFileNames.contains(filename)) 
{ 
    openedFileNames.append(filename); 

    QFile file(filename); 

    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) 
     QMessageBox::warning(this, tr("Error opening!"), tr("Could not open the file")); 

    ... 
} 

關閉一個文件:

openedFileNames.removeAt(openedFileNames.indexOf(filename)); 
file.close(); 
+0

謝謝'@ Nejat'先生幫助我,我已經解決了這個問題。請查看我的代碼,看看我的代碼是好還是壞。再次看我的問題我已更新。 –

0

後敞開的第一時間,可使用:

http://doc.qt.io/qt-5/qlockfile.html

在你的代碼添加:

QFile file(fileDlg); 
if (file.open(QFile::ReadOnly)) { 
    QTextStream in (& file); 
    while (!file.atEnd()) { 
     cache = in .readAll(); 
    } 
} else { 
    //Something... 
    return; 
} 
file.close(); 
+0

謝謝,但是如何使用'QLockFile'類。我已經完成了'QLockFile lockFile(fileDlg); lockFile.lock();'。 –

+0

@LionKing不幸的是我無法阻止閱讀。我明天再試一次。 –