我有一个 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类访问小部件,以便我可以在那里使用它们? 如果没有,在视图和控制器之间进行通信的更好方法是什么?
答案 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;
}
}