Проблема с QsytemFileWatcher и MessageBoxC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Проблема с QsytemFileWatcher и MessageBox

Сообщение Anonymous »

У меня есть текстовый редактор, написанный на Qt. Я добавил в него функцию отката изменений из резервной копии. Как только я меняю открытый файл в другом редакторе, мой код предлагает либо скачать новую версию (кнопка Discard), либо скачать резервную копию. Оба метода работают корректно, но проблема в том, что при любом выборе диалог загружается раз 20. То есть, например, если я выберу скачать из резервной копии, то это произойдет сразу, но сам диалог после этого появится еще много раз. В чем может быть причина и как это исправить?
void EditorTabWidget::onFileExternallyModified(const QString &filePath) {
// Check if changes are being handled by the program
if (internalChangeInProgress) {
return;
}

// Set the flag for change handling
internalChangeInProgress = true;

QMessageBox msgBox;
msgBox.setText(QString("The file %1 has been modified by an external program.").arg(filePath));
msgBox.setInformativeText("What would you like to do?");

// Add buttons
QPushButton *restoreButton = msgBox.addButton(tr("Restore"), QMessageBox::ActionRole);
QPushButton *discardButton = msgBox.addButton(QMessageBox::Discard);

msgBox.setDefaultButton(discardButton);
msgBox.exec();

if (msgBox.clickedButton() == restoreButton) {
// Restore from backup
QString backupPath = backupPaths.value(filePath);
if (!backupPath.isEmpty()) {
QFile backupFile(backupPath);
QFile originalFile(filePath);
if (backupFile.open(QIODevice::ReadOnly) && originalFile.open(QIODevice::WriteOnly)) {
QTextStream in(&backupFile);
QTextStream out(&originalFile);
out findChild("edit_field");
if (textEdit) {
textEdit->setPlainText(in.readAll());
}
}

originalFile.close();
// Restore the watcher after loading
if (watcher) {
for (auto &path : openFilesList) {
watcher->addPath(path);
}
}
} else {
QMessageBox::critical(this, "Error", "Failed to open the file for reloading.");
}
}

// Reset the flag after processing is complete
internalChangeInProgress = false;
}

Вот мой файл заголовка:
class EditorTabWidget : public QTabWidget {
Q_OBJECT
public:
explicit EditorTabWidget(QWidget *parent = nullptr);
QStringListModel *getModel() { return &modelNames; }

bool fileSaved(int index);
void removeTab(int index);
QString saveAs(int index);
QList openFilesList;

public slots:
void addEdit(const QString &fileName);
void addSaved(const QString &filePath);
void addEmpty();
int closeAllTabs();

private slots:
void fileChanged(); // Tracks changes within the editor
void onFileExternallyModified(
const QString &filePath); // Tracks external changes

private:
void addFile(const QString &fileName = "untitled");
void setFile(int index, const QString &fileName = "untitled");
void removeFile(int index);

void saveBackup(const QString &filePath); // Creates or updates the file backup
// Monitoring external changes
void watchExternalFileChanges(const QString &filePath);

QIcon savedButton;
QIcon notSavedButton;
QString styleSheet;

QStringListModel modelNames;
QFileSystemWatcher fileWatcher; // For monitoring external file changes
QMap
backupPaths; // Mapping between files and their backups

QVector closeButtons;
bool internalChangeInProgress = false;
QWidget *findTabWidget(const QString &filePath);
};


Подробнее здесь: https://stackoverflow.com/questions/793 ... messagebox
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»