5

例如这是我的代码

QScopedPointer<QTimer> timer2(new QTimer);

但我想定义

QScopedPointer<QTimer> timer2; 

在 mainwindow.h 中并创建一个实例

timer2(new QTimer);

在 mainwindow.cpp

如何?

4

3 回答 3

8

尝试以下操作:

// mainwindow.h
class MainWindow : public QMainWindow
{
private:
    QScopedPointer<QTimer> timer2;
};

如果要在构造函数中创建实例,请使用以下命令:

// mainwindow.cpp
MainWindow::MainWindow()
    :timer2(new QTimer)
{
}

或者,如果您想在 的某个任意成员函数中创建实例MainWindow,请使用以下命令:

// mainwindow.cpp
void MainWindow::someFunction()
{
    timer2.reset(new QTimer);
}

还值得查看 C++ 中的初始化列表和QScopedPointer.

于 2014-08-11T05:43:58.817 回答
3

resetQScopedPointer的使用方法

timer2.reset(new QTimer());
于 2014-08-11T05:43:14.497 回答
0

你的所作所为等于过早的悲观。当您应该将它们作为成员简单地放入类中时,您正在堆上单独和单独地创建一个MainWindow类的成员:

// interface
#include <QMainWindow>
#include <QTimer>

class MainWindow : public QMainWindow {
  Q_OBJECT
  QTimer m_timer;
public:
  MainWindow(QWidget * parent = 0, Qt::WindowFlags flags = 0);
};

// implementation
MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags flags) :
  QMainWindow(parent, flags),
  m_timer()
{
  ...
}

当然,您通常不希望MainWindow在接口(头文件)文件中公开 's 实现的所有细节。因此,您将利用PIMPL成语:

// interface
#include <QMainWindow>

class MainWindowPrivate;
class MainWindow : public QMainWindow {
  Q_OBJECT
  Q_DECLARE_PRIVATE(MainWindow)
  QScopedPointer<MainWindowPrivate> const d_ptr;
public:
  MainWindow(QWidget * parent = 0, Qt::WindowFlags flags = 0);
}

// implementation
#include "MainWindow.h"
#include <QTimer>

class MainWindowPrivate {
public:
  QTimer timer;
}

MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags flags) :
  QMainWindow(parent, flags),
  d_ptr(new(MainWindowPrivate())
{
  Q_D(MainWindow);
  d->timer.start( ... );
  ...
}
于 2014-08-11T14:18:16.333 回答