【问题标题】:Qt disabling dynamic buttonsQt禁用动态按钮
【发布时间】:2015-01-24 12:30:17
【问题描述】:

我正在尝试禁用用户之前选择的按钮

void pracownik2::on_pushButton_4_clicked(){

this->setWindowTitle("EKRAN");
QWidget *centralWidget = new QWidget;
        int licznik=1;
        QString licz;
        //QString kolumny = ui->lineEdit->text();
        //QString wiersze = ui->lineEdit_2->text();
        miejsca2 = ui->lineEdit_3->text().toInt();
        //QPushButton *button[wiersze.toInt()][kolumny.toInt()];
        QPushButton *button[3][6];

        QGridLayout *controlsLayout = new QGridLayout;
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<6;j++)
            {
                    licz = QString::number(licznik);
                    licznik++;
                    button[i][j] = new QPushButton(licz);
                    button[i][j]->setCheckable(1);
                        if(tab[i][j]==1)
                            button[i][j]->setEnabled(false);
                    controlsLayout->addWidget(button[i][j], i, j);
            }
        }

        QPushButton *okej = new QPushButton("Zatwierdź");
        QPushButton *anul = new QPushButton("Anuluj");

        controlsLayout->addWidget(okej, 3, 0);
        controlsLayout->addWidget(anul, 3, 1);

        controlsLayout->setHorizontalSpacing(0);
        controlsLayout->setVerticalSpacing(0);
        centralWidget->setLayout(controlsLayout);

        setCentralWidget(centralWidget);



        for(int i=0;i<3;i++)
        {
            for(int j=0;j<6;j++)
            {
                    connect(button[i][j],SIGNAL(toggled(bool)),this,SLOT(tescik(bool)));
            }
        }



        connect(anul,SIGNAL(clicked()),this,SLOT(close()));

        connect(okej,SIGNAL(clicked()),this,SLOT(okay2()));}

void pracownik2::tescik(bool t){
    if (t)
{
    tab[i][j]=1;
    miejsca++;
}
else
{
    tab[i][j]=0;
    miejsca--;
}}

但是我的 'tescik' 函数不知道 'i' 和 'j' 是什么并且项目不会编译,我的问题是如何使选中的按钮在数组中设置值为 1 并且未选中将其恢复为 0 . 我想我必须编辑“连接”行,但我不知道怎么做

@编辑 我正在尝试制作这条线

connect(button[i][j],SIGNAL(toggled(bool)),this,SLOT(tescik(bool,int i,int j)));

将当前按钮的“i”和“j”传递给功能,但它不起作用

【问题讨论】:

  • connect(button[i][j], SIGNAL(toggled(bool)), button[i][j], SLOT(setDisabled(bool))); 另外
  • 你能多写点关于它的东西吗,因为我不明白
  • 如果按下后会被禁用,那么如何将数组中的值恢复为0?
  • @CentusDBWA 执行您之前的通话: connect(button[i][j],SIGNAL(toggled(bool)),this,SLOT(tescik(bool))); } 工作?
  • 因为更改数组值不会立即执行任何操作,所以当第二次显示按钮时,其中一些按钮未启用@AB_ 是的,它可以工作

标签: c++ arrays qt dynamic qpushbutton


【解决方案1】:

你无法连接

connect(button[i][j],SIGNAL(toggled(bool)),this,SLOT(tescik(bool,int i,int j)));

因为toggled 怎么知道i,j 的哪些值传递给tescik

但是,您可以在 QPushButtons 上编写一个包装器,以便您可以使用 QSignalMapper 将它们的 toggled(bool) 信号连接到此包装器的单个插槽 toggled( int, int)。然后你可以在这样的包装器中管理所有这些逻辑:

class ButtonHelperEntry
{
public:
    int i_;
    int j_;
    QPushButton* button_;
}

void ButtonHelper::initialize( const std::vector<
                                   QSharedPointer<ButtonHelperEntry> >& entries)
{
    entries_ = entries;
    mapper_.reset(new QSignalMapper(this));
    EntriesIterator it = entries_.begin();

    while ( it!=entries_.end())
    {
       connect(( *it)->button_, SIGNAL( toggled(bool)), mapper_.data(), 
                                                                   SLOT(map()));
       mapper_->setMapping( ( *it)->button_, (int)( *it)->i_, (int)( *it)->j_);
       it++;
       i++;
    }
    connect( mapper_.data(), SIGNAL( mapped(int,int)), 
                             this, SIGNAL( toggled(int,int)));
    connect( this, SIGNAL( toggled(int)), this, SLOT( updateValue(int)));
}

【讨论】:

    【解决方案2】:

    我会将 i 和 j 设置为每个按钮的属性:

    ...
    button[i][j]->setProperty("i", i);
    button[i][j]->setProperty("j", j);
    ...
    

    然后在 tescik() 中获取发送者并加载 i 和 j:

    void pracownik2::tescik(bool t) {
       QObject * pSender = sender();
       int i = pSender->property("i").toInt();
       int j = pSender->property("j").toInt();
    
       if (t) {
       ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      相关资源
      最近更新 更多