A 部分:
我创建了一个名为 Panel
的小部件,我想迭代地创建它的新实例。
因此,例如,它看起来像这样:
Panel *panelArray[10];
for(int i=0;i<10;i++) panelArray[i] = new Panel(this);
这是合适的语法吗?
B 部分:
如果是这样,我如何手动连接每个面板发出的信号?
例子:
for(int i=0;i<10,i++) connect(panelArray[i], SIGNAL(raiseToggleGUICmd(QByteArray)), this, SLOT(writeData(QByteArray)));
提前致谢!
最佳答案
A 部分看起来很正常。
B 部分看起来也很正常,但是如果你想知道哪个小部件发出信号,你应该使用类似这样的东西(在你的情况下,你的插槽对每个小部件做同样的事情)
QSignalMapper
的使用
signalMapper = new QSignalMapper(this);
for (int i = 0; i < 3; ++i)
{
QPushButton *button = new QPushButton(QString::number(i),this);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
button->move(i*10,i*10);//doesn't matter
signalMapper->setMapping(button, QString::number(i));
}
connect(signalMapper, SIGNAL(mapped(const QString &)),
this, SLOT(clicked(const QString &)));
//...
void MainWindow::clicked(const QString & text)
{
QMessageBox::information(this, "TEST", text, QMessageBox::Ok);
}
或者使用sender()
for (int i = 0; i < 3; ++i)
{
QPushButton *button = new QPushButton(QString::number(i),this);
button->setObjectName(QString::number(i));//important
connect(button, SIGNAL(clicked()), this, SLOT(clicked()));
button->move(i*10,i*10);
}
void MainWindow::clicked()
{
switch( sender()->objectName().toInt())
{
case 0:
QMessageBox::information(this, "TEST", "0", QMessageBox::Ok);//do something specific to 0 widget
break;
case 1:
QMessageBox::information(this, "TEST", "1", QMessageBox::Ok);//do something specific to 1 widget
break;
case 2:
QMessageBox::information(this, "TEST", "2", QMessageBox::Ok);//and so on
break;
}
}
关于c++ - 动态创建自定义小部件的新实例并连接信号和插槽 (Qt),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25769653/