0

Qtを使用して、リストの要素を数量でフィルタリングしようとしています。フィルターボタンを押しただけで何も起こりません。たぶん、SLOT 関数で何か間違ったことをしているのでしょう。私が使用しているフィルター関数は、Qt を使用していない他のプログラムで完全に機能します。これは、ウィンドウがどのように見えるかです:

http://i.imgur.com/dKbZ50R.png?1 - I uploaded the picture with the windows on imgur because I don't have 10 reputation to upload it from here.

void MedicineManagementGUI::openFilterWindow(){
    ui.filterWindow = new QWidget;
    uiFilterMedicine.setupUI(ui.filterWindow);
    QObject::connect(uiFilterMedicine.btnFilterQuantity,SIGNAL(clicked()),uiFilterMedicine.filterWindow,SLOT(filterAllByQuantity()));
    ui.filterWindow->show();
}

フィルタースロット

void MedicineManagementGUI::filterAllByQuantity(){
    uiFilterMedicine.medFilterList->clear();
    QString quantityQString = uiFilterMedicine.txtQuantity->text();
    int quantity = quantityQString.toInt();
    List<Medicine*> filtered = ctrl->filterByLessQuantity(quantity);
    for(int i=0; i < filtered.size(); i++){
        int ID = filtered.getElement(i)->getID();
        string name = filtered.getElement(i)->getName();
        float concentration = filtered.getElement(i)->getConcentration();
        int quantity = filtered.getElement(i)->getQuantity();

        QString iDQString = QString::number(ID);
        QString nameQString = QString::fromStdString(name);
        QString concentrationQString = QString::number(concentration);
        QString quantityQString = QString::number(quantity);

        QString medicineAsString = iDQString+" - "+nameQString+" - "+concentrationQString+" - "+quantityQString;
        QListWidgetItem* item = new QListWidgetItem(medicineAsString, uiFilterMedicine.medFilterList);
        item->setData(Qt::UserRole,iDQString);
    }
}

フィルタ関数: クラス:

class Filter{
public:
    virtual bool include(Medicine* m)=0;
    virtual ~Filter(){};
};

class LessThanQuantity: public Filter{
private:
    int quantity;
public:
    LessThanQuantity(int q){
        this->quantity=q;
    }
    bool include(Medicine* m){
        return m->getQuantity()<quantity;
    }
};

コントローラーからのフィルター関数:

List<Medicine*> Controller::filterBy(Filter* filter){
    List<Medicine*> rez = List<Medicine*>();
    List<Medicine*> medList = repo->getAll();
    Iterator<Medicine*> it = medList.getIterator();
    for(it.first(); it.valid(); it.urmator()){
        Medicine* m = it.element();
        if(filter->include(m)){
            rez.insert(rez.size(),m);
        }
    }
    return rez;
}

List<Medicine*> Controller::filterByLessQuantity(int quantity){
    LessThanQuantity* f = new LessThanQuantity(quantity);
    return filterBy(f);
}

私はどこで間違っていますか?さらに情報が必要な場合は、教えてください。:)

4

1 に答える 1

0

http://qt-project.org/doc/qt-4.8/debug.html

私は追加します

#include <QDebug>

// ...

// at the top of each function that might not get called
qDebug() << Q_FUNC_INFO;

これで、スロットが呼び出されているかどうかについての質問に答えるはずです。QObject::connectまた、コンソールは、呼び出しが失敗した場合などの実行時エラーを出力することもできます。

編集:また、ループへの入り口に影響を与える可能性のある主要なメトリックを出力します...

List<Medicine*> filtered = ctrl->filterByLessQuantity(quantity);
// this line added before the loop
qDebug() << "filtered.size()" << filtered.size();

出力されたサイズがゼロの場合は、filterByLessQuantity関数にいくつかのデバッグ ステートメントを追加し、要素が失われている場所を確認します。

それが役立つことを願っています。

于 2013-05-17T22:21:48.283 に答える