2016-03-20 13 views
0

Qt Creator'da bir alışveriş listesi olarak işlev gören bir GUI projem var. QTableWidget öğelerine öğe eklemek için QLineEdit kullanıyorum. Kullanıcı bir şeyi girer, QPushButton'a basar. Yuva daha sonra QTableWidget öğesine, ilk sütunda ve ikinci sütunda yeni bir QPushButton ile yeni bir satır ekler. Daha sonra kullanıcının düğmeyi basabilmesini ve bu satırı temizlemesini istiyorum, ancak bu yuvaya veya göndericiye nasıl erişeceğimi bilmiyorum (uygun terimden emin değilim.) İşte buradaki kod şu ana kadar . itemList benim QTableWidget'ım, itemInput QLineEdit.Çalışma zamanı sırasında oluşturulan bir düğmenin tıklat() yuvasına erişme - Qt Creator

void MainWindow::on_btnAddItem_clicked() 
{ 
    ui->itemList->insertRow(ui->itemList->rowCount()); 
    ui->itemList->setItem((ui->itemList->rowCount())-1,0,new QTableWidgetItem(ui->itemInput->text())); 
    QPushButton *clear = new QPushButton("Clear",this); 
    ui->itemList->setIndexWidget(ui->itemList->model()->index(ui->itemList->rowCount()-1, 1), clear); 
    ui->itemInput->clear(); 
} 

Program başlangıçta çalıştırıldığı zaman budur. onlar butonuna tıklayın sonra, on_btnAddItem_clicked()

initial run

Sonra şöyle çalışır ve ben açık düğmesi bir parçasıdır satırı kaldırmak yapmak istiyorum.

table entry

Ben yeni alanı oluşturmak gerekir mi? Herhangi bir yardım?

+0

*** Yeni bir yuva mı oluşturmalıyım? *** Varsa, yok. Görüyorsunuz ki yeni butonu yaratıyorsunuz fakat 'clicked()' sinyalini MainWindow'daki bir yuvaya bağlamıyorsunuz. Ayrıca, oluşturduğunuz yeni yuva için 'on_' adlandırma kuralını kullanmayın, çünkü bu otomatik bir bağlantı olmayacaktır. – drescherjm

+0

@drescherjm, anladığım kadarıyla, "clicked()" sinyalini QTableWidget'ın (veya modelinin veya temsilcisinin) belirli bir yuvasına giriş parametresi olarak karşılık gelen bir "QTableWidgetItem" ile bağlamaya çalışıyor. QTableWidgetItem öğesinin içeriğini düzenlemek/silmek mümkündür. 'Clicked() 'sinyali sadece' bool 'parametresini parametre olarak geçirebilir, böylece hangi satırın silineceğini nasıl bulurlar? Kulağa doğru geliyor mu? – vicrucann

+0

Hayır hayır, zaten girdiğim() sinyali aynı satırda yeni bir PushButton ile birlikte tabloya kullanıcı girdisini ekler. Daha sonra kullanıcının düğmeyi basabilmesini ve satırı temizlemesini istiyorum. Bu şekilde, tablodaki girdileri silebilirler. Ancak satırları ve düğmeleri önceden oluşturamıyorum çünkü bir kullanıcının ne kadar girdi gireceğini bilmiyorum, bu yüzden programın çalışmasına rağmen bir butonun nasıl yapılacağını bilemiyorum. – Tom

cevap

0

Kendi düğme sınıfınızı yapmalı ve QPushButton'u miras almalısınız. Böyle bir şey:

class MyButton : public QPushButton { 
    public: 
    MyButton(); 
    QTableWidgetItem *titem; 
} 

Ve burada MainWindow:

void MainWindow::on_btnAddItem_clicked() 
{ 
    ui->itemList->insertRow(ui->itemList->rowCount()); 
    ui->itemList->setItem((ui->itemList->rowCount())-1,0,new QTableWidgetItem(ui->itemInput->text())); 
    MyButton *clear = new MyButton("Clear",this); 
    clear->titem = ui->itemList->item(ui->itemList->rowCount()-1, 0); 
    connect(clear, SIGNAL(clicked()), SLOT(on_btnClear_Clicked())); 
    ui->itemList->setIndexWidget(ui->itemList->model()->index(ui->itemList->rowCount()-1, 1), clear); 
    ui->itemInput->clear(); 
} 

void MainWindow::on_btnClear_Clicked() 
{ 
    MyButton *btn = (MyButton*)QObject::sender(); 
    ui->itemList->removeRow(btn->titem->row()); 
} 

unutmayın, bunu yapmak için tek bir adımdır.

+0

Bunun yerine 'qobject_cast (QObject :: sender())' kullanmak daha iyi olurdu. – owacoder

İlgili konular