从静态方法中的QT插槽调用方法

问题描述 投票:0回答:1

我有一个静态方法,该方法显示一个列表(项目)并在Items中返回一个选定对象的数组。我想添加一个复选框来重新加载一些参数列表。我们正在使用QT 3.3。

//// Static
int CMSUI_InputDialog::FittingList(QWidget* parent,
  const CString& Title,
  const CStringArray& Items,
  bool                  IsMultiSelect,
  int                       DefaultItem,
  bool                  OkIsDefault,
    CArray<int, int>& Selecteds)
{

 int ret = 0;
 Selecteds.RemoveAll();

 /// Create grid
 QDialog    dialog(parent, 0, true);
 dialog.setCaption(QString(Title));

 QGridLayout* pLayoutGrid = Init(&dialog, OkIsDefault);

 //Create checkBox
 QCheckBox* pCheckBox = new QCheckBox(&dialog, "m_pApply_Filter");
 pCheckBox->setText("Norm Filter");

 pLayoutGrid->addWidget(pCheckBox, 0, 0);

 QObject::connect(pCheckBox, SIGNAL(stateChanged(int)), &dialog, SLOT(checkboxClicked()));

 /// Create ListBox
 QListBox* pList = new QListBox(&dialog);
 pList->setMinimumSize(QSize(370, 90));

 pList->setSelectionMode(QListBox::Extended);

 // Load the list
 int Count = Items.GetSize();
 for (int i = 0; i < Count; i++)
 {
    QString QS(Items[i]);
    pList->insertItem(QS);
 }

 if (DefaultItem >= 0 && DefaultItem < Count)
    pList->setSelected(DefaultItem, true);

 pLayoutGrid->addWidget(pList, 1, 0);

 // Connect double clic on QDialog accept
 QObject::connect(pList, SIGNAL(doubleClicked(QListBoxItem*)), &dialog, SLOT(accept()));

 if (dialog.exec() == QDialog::Accepted)
 {
    for (int i = 0; i < Count; i++)
    {
        if (pList->isSelected(i))
            Selecteds.Add(i);
    }
    ret = 1;
  }

  return ret;
}

void CMSUI_InputDialog::checkboxClicked()
{
    //To do
}

checkboxClicked()在CMSUI_InputDialog.h中声明为插槽

class CMSUI_InputDialog
{
protected :

    static QGridLayout* Init(QWidget* pParent, bool OkIsDefault);

public slots:
    void checkboxClicked();


public:
    /// CheckBox  + ListBox for fittings
    static int FittingList(QWidget* parent,
        const CString& Title,
        const CStringArray& Items,
        bool                    IsMultiSelect,
        int                     DefaultItem,
        bool                    OkIsDefault,
        CArray<int, int>& Selecteds);
};

我尝试了很多事情,但是我对QT感到愚蠢,但是没有成功完成复选框上的操作

c++ qt static-methods
1个回答
0
投票
  1. 您不检查connect方法返回的结果:失败时返回connect。我很确定在您的情况下,false会失败,因此没有其他必要。该插槽不会被调用。

  2. 插槽必须是connect中的方法。添加“插槽”的类并非源自QObject

  3. QObject是一个空的宏(扩展为空),因此对编译没有影响。但是,它有一个目的:处理头文件的slots(元对象编译器)将注意到该宏并将后续方法作为插槽进行处理。 除非您也有moc],否则不会这样做。

  4. 查看项目中的其他示例,以了解它们如何解决此类问题。按今天的标准来看,这段代码已经过时了,但是据我了解,这是一项维护工作,因此您必须做更多的相同工作-因为我想您不是要升级Qt版本。

即使在Qt 3时代,该项目中的模式看起来也很奇怪-似乎普遍使用globals / singletons是值得的。

© www.soinside.com 2019 - 2024. All rights reserved.