动态创建一个自定义窗口小部件的新实例和连接信号和插槽(QT)
A部分:动态创建一个自定义窗口小部件的新实例和连接信号和插槽(QT)
我创建了一个名为Panel
控件我想反复做出的新实例其中。
因此,举例来说,它看起来是这样的:
Panel *panelArray[10];
for(int i=0;i<10;i++) panelArray[i] = new Panel(this);
这会是适当的语法?
PART 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;
}
}
哇。我在想这件事,并看到一些signalmapper的东西出现在我的谷歌搜索...非常感谢你这个真棒帖子!我肯定会在将来使用它,我相信!再次感谢。这太棒了。请在回答顶部添加一个小小的blerb,直接回复/回复我的问题的组成部分,我会将其视为“已回答” – Rachael 2014-09-10 16:38:57
@Rachael不幸的是,英语不是我的母语,我不知道什么是这个“blerb”。对不起。请看我的编辑,是你想要的吗? – Chernobyl 2014-09-10 17:02:36
抱歉。 “Blurb”是正确的拼写,我用它来问“请在答案顶部写一些* *”。再次感谢。 – Rachael 2014-09-10 17:26:41
两个部分看起来OK。如果设计好坏取决于最终要求 – eferion 2014-09-10 15:47:19
谢谢@eferion :)我会继续前进。 – Rachael 2014-09-10 15:49:14