Qt:信号、插槽和Q_对象
我已经用Qt写了一个程序,它工作得很好,但是点击按钮不起作用。 当我在类声明之后使用Q_对象时,它会给我编译错误 这是我的密码:Qt:信号、插槽和Q_对象,qt,qpushbutton,Qt,Qpushbutton,我已经用Qt写了一个程序,它工作得很好,但是点击按钮不起作用。 当我在类声明之后使用Q_对象时,它会给我编译错误 这是我的密码: #include <QApplication> #include <QPushButton> #include <QLabel> #include <QWidget> class Communicate : public QWidget { // Q_OBJEC
#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QWidget>
class Communicate : public QWidget
{
// Q_OBJECT
public:
Communicate(QWidget *parent = 0);
private slots:
void OnPlus();
void OnMinus();
private:
QLabel *label;
};
Communicate::Communicate(QWidget *parent)
: QWidget(parent)
{
QPushButton *plus = new QPushButton("+", this);
plus->setGeometry(50, 40, 75, 30);
QPushButton *minus = new QPushButton("-", this);
minus->setGeometry(50, 100, 75, 30);
label = new QLabel("0", this);
label->setGeometry(190, 80, 20, 30);
connect(plus, SIGNAL(clicked()), this, SLOT(OnPlus()));
connect(minus, SIGNAL(clicked()), this, SLOT(OnMinus()));
}
void Communicate::OnPlus()
{
int val = label->text().toInt();
val++;
label->setText(QString::number(val));
}
void Communicate::OnMinus()
{
int val = label->text().toInt();
val--;
label->setText(QString::number(val));
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Communicate window;
window.setWindowTitle("Communicate");
window.show();
return app.exec();
}
#包括
#包括
#包括
#包括
类通信:公共QWidget
{
//Q_对象
公众:
通信(QWidget*parent=0);
专用插槽:
void OnPlus();
在分钟内无效();
私人:
QLabel*标签;
};
通信::通信(QWidget*父)
:QWidget(父项)
{
QPushButton*plus=新的QPushButton(“+”,这个);
plus->setGeometry(50,40,75,30);
QPushButton*减号=新的QPushButton(“-”,this);
减->设置几何体(50,100,75,30);
标签=新的QLabel(“0”,此);
标签->设置几何体(190、80、20、30);
连接(plus,信号(clicked()),此,插槽(OnPlus());
连接(减号,信号(点击()),这个,插槽(OnMinus());
}
void Communicate::OnPlus()
{
int val=label->text().toInt();
val++;
label->setText(QString::number(val));
}
void Communicate::OnMinus()
{
int val=label->text().toInt();
瓦尔--;
label->setText(QString::number(val));
}
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
沟通窗口;
window.setWindowTitle(“通信”);
window.show();
返回app.exec();
}
使用O_QBJECT宏,要更正出现的错误,您可以:
1) 在自己的.h文件中声明QWidget/QObject派生类,并在自己的.cpp文件中定义它
2) 将moc在类定义后生成的.moc文件包含在您拥有的.cpp中(添加类似于#include“xxxx.moc”的内容)
LE:此外,您还希望使用布局而不是使用setGeometry将小部件放置到窗口中,阅读更多内容您需要通过moc运行包含Q_对象宏的文件,并编译它的输出并将其与其他应用程序链接在一起。根据您的构建系统,这会自动发生(qmake)或通过添加一行左右(cmake)当我使用单独的.h和.cpp文件时,我发现它运行正常,事实上,这是我在系统上运行的一个教程代码,告诉我要创建单独的文件。我为自己修改了,想知道为什么会发生这种情况,为什么我们不能在main.cpp中编写所有内容??另外,我不理解你的第二个方法,MOC?MOC是一个Qt工具,它为QObjo派生类功能生成C++代码,比如:信号和槽。不管怎样,推荐的方法是第一个,不要忽略使用布局的建议,而不是手动设置小部件在父位置上的位置。为什么我们不能在Mead中编写所有的内容?CPP??可以,但是然后你必须包括“Meal.Moc”***(这样C++编译器就可以看到生成的东西)***的名字可能会有所不同,这可能取决于moc版本等(这是将h/cpp文件用于类并让工具完成其工作的另一个原因)