c++ - 动态创建自定义小部件的新实例并连接信号和插槽 (Qt)

标签 c++ qt iteration instantiation qtwidgets

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/

相关文章:

c++ - 成员函数的部分模板特化 : "prototype does not match"

c++ - Qt - 如何在 QVBoxLayout 中放置具有左右边距的 QTextEdit?

c++ - ShellExecuteEx runas 中的 lpParameters

c++ - QVector::replace() 是否创建深拷贝?

excel - 幂法 - 非收敛系统

clojure - 在 Clojure 中如何迭代直到达到固定点?

c++ - 根据相对于彼此的不同对值对由嵌套对组成的 vector 进行排序?

c++ - 在类外为模板类声明非模板友元函数

c++ - 基于时间复杂度,这三种算法有什么区别?

c - 多个for循环总结为一个循环