Здесь есть небольшая спецификация Qt c, что касается основной проблемы: все это понятно в простом C ++, нет необходимости в знании Qt.
Вы не проверяете результат, возвращаемый методом connect
: он возвращает false
в случае неудачи. connect
в вашем случае терпит неудачу, поэтому нет смысла идти дальше. Слот не будет назван. Причина этого: dialog
это просто QDialog
, а не CMSUI_InputDialog
. Вы не можете добавлять слоты в существующий класс Qt.
Слоты должны быть методами в QObject
s. Класс, в который вы добавили «слот», не является производным от QObject
. Вам нужно создать такой класс (чтобы заменить QDialog
, который вы используете).
slots
- это пустой макрос (расширяется до нуля) и таким образом, не влияет на сборку. Однако у него есть цель: moc
(мета-объектный компилятор), который обрабатывает заголовочный файл, заметит этот макрос и обработает последующие методы как слоты. Это не сработает, если у вас не будет макроса Q_OBJECT
в классе .
Сначала вы захотите выделите параметры для этого диалога в структуру FittingOptions
, чтобы сделать код управляемым.
struct FittingOptions {
const CStringArray& items,
bool isMultiSelect,
int defaultItem,
bool okIsDefault,
};
Диалог должен стать новым классом, в котором ваш слот будет go:
class FittingList : public QDialog {
Q_OBJECT
FittingOptions opt;
CArray<int, int>* selecteds;
public:
FittingList(QWidget *parent, const FittingOptions &options) :
QDialog(parent), opt(options), selecteds(0)
{
// TODO: initialization code that creates widgets etc.
}
void setSelecteds(CArray<int, int> &selecteds)
{
this->selecteds = &selecteds;
}
// ...
public slots:
void checkboxChanged() { /* TODO */ }
};
А затем поместите код инициализации из метода FittingList
в конструктор. Измените этот метод на:
int CMSUI_InputDialog::FittingList(QWidget* parent,
const CString& title,
const CStringArray& items,
bool isMultiSelect,
int defaultItem,
bool okIsDefault,
CArray<int, int>& selecteds)
{
const FittingOptions options = {
items, isMultiSelect, defaultItem, okIsDefault
};
::FittingList dialog(parent, options);
dialog.setCaption(QString(title));
dialog.setSelecteds(selecteds);
if (dialog.exec() != QDialog::Accepted) return 0;
return 1;
}
Посмотрите другие примеры в вашем проекте, чтобы увидеть, как они справились с такими проблемами. Этот код довольно устарел по сегодняшним стандартам, но, насколько я понимаю, это работа по техническому обслуживанию, поэтому вы должны сделать больше того же самого - поскольку я полагаю, что вы не обновляете версию Qt.
Примечание: это очевидно то, что касается оригинального автора (ов) кода, а не вас. Вы не написали этот материал. Даже во времена Qt 3 этот код считался бы хрустким - кажущееся повсеместным использование глобальных / синглетных кодов достойно кропотливой работы. Я всегда удивляюсь, почему люди, работающие над такими, предположительно, крупномасштабными проектами, не будут изучать код, за который они заплатили и который им доступен: Qt 3 включает полный исходный код для Qt Designer, и именно здесь можно было бы найти вдохновение / обучение , В наши дни Qt Creator является гораздо большей кодовой базой, чем Designer (более чем на порядок), и имеет достаточно приличную архитектуру, поэтому крупномасштабные проекты могут черпать вдохновение.