使用信号和插槽访问自定义QWidget类的功能

时间:2017-11-16 17:13:33

标签: c++ qt

我有一个 MediaView 类,它继承了QWidget并具有GUI组件。我有另一个类 MediaController ,它处理GUI组件所做的更改。

我需要: 当我收到信号finishedLoadingFile()

时启用按钮

以下是我班级的样子:

MediaView.cpp

MediaView::MediaView(QWidget* parent) : QWidget(parent)
{
   m_controller = new MediaController(this);

   m_btnPlay = new QPushButton(m_mediaButtons);
   m_btnPlay->setIcon(QIcon(":/images/play.png"));
   m_btnPlay->setIconSize(QSize(32, 32));
   m_btnPlay->move(100, 10);
   m_btnPlay->resize(39, 38);
   m_btnPlay->setToolTip("Play");

   m_btnPause = new QPushButton(m_mediaButtons);
   m_btnPause->setIcon(QIcon(":/images/pause.png"));
   m_btnPause->setIconSize(QSize(32, 32));
   m_btnPause->move(150, 10);
   m_btnPause->resize(39, 38);
   m_btnPause->setToolTip("Pause");

   m_btnPlay->setEnabled(false);
   m_btnPause->setEnabled(false);

   connect(m_btnOpen, SIGNAL(clicked(bool)), m_controller, SLOT(loadFile()));
   connect(m_btnPlay,SIGNAL(clicked(bool)),m_controller,SLOT(buttonPlayClicked()));
   connect(m_btnPause,SIGNAL(clicked(bool)),m_controller,SLOT(buttonPauseClicked()));
}

void MediaView::enableButtons()
{
   m_btnPlay->setEnabled(true);
   m_btnPause->setEnabled(true);
}

MediaController.cpp

MediaController::MediaController(QWidget* parent) : QWidget(parent)
{
    MediaView* view = new MediaView(this); //loop here
    connect(this, SIGNAL(loadingFileFinished(), view, SLOT(enableButtons()));
}

void MediaController::loadFile()
{
    m_filePath = "";

    m_filePath = QFileDialog::getOpenFileName(this, "Choose a .txt file with paths to gtt streams", QString(),
             QString("text file(*.txt)"));

    if (m_filePath.isEmpty())
    {
        return;
    }

    m_file = "";
    m_file.append(m_filePath.toLocal8Bit().constData());

    emit finishedLoadingFile();
}

问题:

我希望调用MediaView类中的enableButtons()。但是当我在MediaController中实例化MediaView类时,应用程序崩溃是因为它们一直在循环中调用彼此的构造函数。原因是,它们都使用信号和插槽进行通信,因此我需要实例化各自类的对象。

备选方案:

我想知道是否可以从MediaController类访问小部件,以便我可以在那里使用它们? 如果没有,在视图和控制器之间进行通信的更好方法是什么?

1 个答案:

答案 0 :(得分:0)

每个MediaView创建一个MediaController,每个MediaController创建另一个MediaView,生成无限循环,适当的是在MediaView中创建MediaController并建立连接:

MediaController

没有必要在MediaView内创建新的MediaController

如果您想从MediaView访问MediaController,可以通过父级进行操作,因为MediaView *view; MediaController::MediaController(QWidget* parent) : QWidget(parent) { view = qobject_cast<QMediaView *>(parent); //or // connect(this, &MediaController::loadingFileFinished, view, &MediaView::enableButtons); } 的父级:

<强> MediaController.h

foreach ($list_of_codes as $k => $v)
{
    //  $rand = rand(1,15);
    $rand = $refidorder;
    $code = $rand++;
}

<强> MediaController.cpp

public class MyAdapter extends BaseAdapter {

Context context;
String[] data;


public MyAdapter(Context context, String[] myData) {
    this.context = context;
    this.data = myData;
}


@Override
public int getCount() {
    return data.length;
}

@Override
public Object getItem(int position) {
    return data[position];
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater)
                    context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

            convertView = mInflater.inflate(R.layout.grid, null);
        }

    TextView text = (TextView) convertView.findViewById(R.id.textView);
    text.setText(data[position]);
    return convertView;

}
}