Я программирую в QT 4.8.4 с C ++. Я хочу иметь раскрывающееся меню, в котором я могу выбрать опцию, а затем он запустит исполняемый файл с выбранным пунктом в меню в качестве опции для исполняемого файла.
Вот мой код:
#ifndef GUI_H
#define GUI_H
#include <QDialog>
#include <QtGui>
class QLabel;
class QLineEdit;
class QPushButton;
class gui : public QDialog
{
Q_OBJECT
public:
gui(QWidget *parent = 0);
public slots:
void gui::on_go_clicked();
private:
QLabel *label1;
QLabel *label2;
QLineEdit *lineEdit;
QPushButton *goButton;
QComboBox cb;
};
#endif
И файл .cpp:
#include <QtGui>
#include <QApplication>
#include <QComboBox>
#include "gui.h"
#include <vector>
gui::gui(QWidget *parent) : QDialog(parent)
{
label1 = new QLabel(tr("Insert Name (Optional):"));
label2 = new QLabel(tr("Class Name (Required):"));
lineEdit = new QLineEdit;
goButton = new QPushButton(tr("&Go"));
goButton->setDefault(true);
connect(goButton, SIGNAL(clicked()), this, SLOT(on_go_clicked()));
QComboBox *cb = new QComboBox();
cb->addItem("Hello", "1");
cb->addItem("Test", "2");
QHBoxLayout *hLayout1 = new QHBoxLayout;
hLayout1->addWidget(label1);
hLayout1->addWidget(lineEdit);
QHBoxLayout *hLayout2 = new QHBoxLayout;
hLayout2->addWidget(label2);
hLayout2->addWidget(cb);
QHBoxLayout *hLayout3 = new QHBoxLayout;
hLayout3->addWidget(goButton);
hLayout3->addStretch();
QVBoxLayout *vLayout = new QVBoxLayout;
vLayout->addLayout(hLayout1);
vLayout->addLayout(hLayout2);
vLayout->addWidget(cb);
vLayout->addLayout(hLayout3);
setLayout(vLayout);
setWindowTitle(tr("TEST"));
setFixedHeight(sizeHint().height());
}
void gui::on_go_clicked()
{
QMessageBox::information(this, "ASDF", cb.currentText());
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
gui *stuff = new gui;
stuff->show();
return app.exec();
}
Сейчас я просто пытаюсь понять, как использовать QComboBox, который не работает. Мой код компилируется, но когда я запускаю его, я получаю «Object :: connect: Нет такого слота gui :: on_go_clicked ()»
Я делаю именно то, что говорит учебник. Я не могу понять, почему это не работает.
Удалить gui::
:
class gui : public QDialog{
Q_OBJECT
...
public slots:
void gui::on_go_clicked();
^^^^^
Remove it
Интересно, почему вы код даже компилирует. Нет дополнительной квалификации для участника on_go_clicked.
Удалите gui :: from on_go_clicked в вашем заголовке.
У вас есть два объекта QComboBox, на которые вы ссылаетесь.
Первый на уровне класса:
class gui : public QDialog{
Q_OBJECT
public:
gui(QWidget *parent = 0);
public slots:
void gui::on_go_clicked();
private:
QLabel *label1;
QLabel *label2;
QLineEdit *lineEdit;
QPushButton *goButton;
QComboBox cb; // <<<=== class-level automatic object
};
Вторым является локальный указатель на объект QComboBox, который существует в конструкторе.
gui::gui(QWidget *parent) : QDialog(parent){
...
QComboBox *cb = new QComboBox(); // <<<=== function-level pointer using the same name
// as the class-level automatic object
Чтобы исправить проблему, вы можете изменить объект уровня класса на указатель, а затем изменить создание объекта на простое присваивание вместо объявления и инициализации.
cb = new QComboBox();
Кроме того, как только вы это сделаете, вам нужно будет изменить слот так, чтобы оператор разыменования указателя использовался для доступа к text()
функция
void gui::on_go_clicked(){
QMessageBox::information(this, "ASDF", cb->currentText());
}