动态创建一个自定义窗口小部件的新实例和连接信号和插槽(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))); 

提前感谢!

+1

两个部分看起来OK。如果设计好坏取决于最终要求 – eferion 2014-09-10 15:47:19

+0

谢谢@eferion :)我会继续前进。 – Rachael 2014-09-10 15:49:14

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; 
    } 
} 
+0

哇。我在想这件事,并看到一些signalmapper的东西出现在我的谷歌搜索...非常感谢你这个真棒帖子!我肯定会在将来使用它,我相信!再次感谢。这太棒了。请在回答顶部添加一个小小的blerb,直接回复/回复我的问题的组成部分,我会将其视为“已回答” – Rachael 2014-09-10 16:38:57

+0

@Rachael不幸的是,英语不是我的母语,我不知道什么是这个“blerb”。对不起。请看我的编辑,是你想要的吗? – Chernobyl 2014-09-10 17:02:36

+0

抱歉。 “Blurb”是正确的拼写,我用它来问“请在答案顶部写一些* *”。再次感谢。 – Rachael 2014-09-10 17:26:41