QComboBox 无法连接
Posted
技术标签:
【中文标题】QComboBox 无法连接【英文标题】:QComboBox doesn't connect 【发布时间】:2013-08-15 20:15:23 【问题描述】:我正在使用 C++ 在 QT 4.8.4 中编程。我想要一个下拉菜单,我可以在其中选择一个选项,然后它将运行一个 exe,并将菜单上的选定项目作为 exe 的选项。
这是我的代码:
#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: No such slot gui::on_go_clicked()”
我正在按照教程所说的去做。我不知道为什么这不起作用。
【问题讨论】:
【参考方案1】:删除gui::
:
class gui : public QDialog
Q_OBJECT
...
public slots:
void gui::on_go_clicked();
^^^^^
Remove it
【讨论】:
【参考方案2】:我想知道为什么你的代码甚至可以编译。没有“会员 on_go_clicked 的额外资格”。 从标题中的 on_go_clicked 中删除 gui::。
【讨论】:
多余的 gui:: 部分不是 c++ 中的错误,它与 Qt 的信号和槽系统有关,它根本不明白它们是相同的。 AFAIK,在 MSVC++ 等一些编译器中,可以编写这样的代码(使用额外的限定)。但是它不是标准的。 代码编译是因为 QObject::connect 接受了 char* 参数。编译时没有检查。文档可以在这里找到qt-project.org/doc/qt-5.0/qtcore/qobject.html#connect Lochemage,segfault,信号/槽连接不工作的原因,一目了然。但是使用 gcc,您将无法编译此代码。我会说很好的行为。这样的错误很容易被复制粘贴,但不容易发现。 如果我去掉 gui::,我就不能使用插槽中的 QComboBox。【参考方案3】:您有两个引用的 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());
【讨论】:
另外,在构造函数中,您将QComboBox
分配给hLayout2
,然后再将其重新分配给vLayout
。你需要决定你想要它的布局。
哦,那不是故意的。我想我只是在重新安排事情以使其发挥作用时才把它留在里面。以上是关于QComboBox 无法连接的主要内容,如果未能解决你的问题,请参考以下文章