1
我試圖理解和使用RAII,並希望在此實施意見:RAII和Qt信號
我想RAII PauseProcessRAII發出信號,另外一個在析構函數。例如:
// Header
public:
PauseProcessRAII(QObject *parent = 0);
void Execute();
~PauseProcessRAII();
signals:
void PauseProcess(bool pause_process);
// Source
PauseProcessRAII::~PauseProcessRAII()
{
emit PauseProcess(false);
}
void PauseProcessRAII::Execute()
{
emit PauseProcess(true);
}
// MainWindow code
void MainWindow::OnPauseProcessRAII(bool pause_process)
{
qDebug() << "pause_process: " << pause_process;
}
void MainWindow::OnButtonSaveClicked()
{
PauseProcessRAII pauseProcessRAII(this);
connect(&pauseProcessRAII, &PauseProcessRAII::PauseProcess, this, &MainWindow::OnPauseProcess);
pauseProcessRAII.Execute();
// ... Some code runs
// ... pauseRAII desctructor is called
}
當我運行代碼都發射如預期的射擊。我的問題是這是一個好的解決方案?起初我雖然PauseProcessRAII析構函數中的emit調用不起作用,因爲它可能已經破壞了信號和插槽連接。當然,這意味着我將不得不將連接添加到我使用它的每個函數中。
這不是一個RAII成語。在RAII中,資源在構造函數中獲取並在析構函數中銷燬。我在構造函數中沒有看到任何資源獲取(我準備考慮發出一種資源管理形式的信號)。同樣,每個RAII課程都必須仔細考慮複製,移動和分配政策,而且我也沒有在這裏看到它。 – SergeyA
除了將事件連接到主窗口外,此處沒有資源。因此,部分轉讓所有權是有問題的(可能是一個可疑的QT設計) –
起初,我要在構造函數中發出信號,但連接尚未完成,因此不會觸發。謝謝,我想我有更多的閱讀要做。我拿走了有關RAII的想法是在堆棧上創建它,所以當函數超出範圍時,析構函數將被調用。我需要這種事情發生,但發出信號,而不是 – adviner