小弟自己想了一个小例子,思路如下
1. 一个对话框,包括两个按钮和一个布局;
2. 一个按钮A最初为setEnabled(false),需要在点击另一个按钮B后,A才可用。
代码如下(为方便,将声明和定义卸载一个.cpp文件中的)
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDialog>
//定义新的QDialog类
class cDialog:public QDialog{
//Q_OBJECT
//经实践证明不用在声明时加Q_OBJECT,加了之后翻到编译报错undefined reference to 'vtable for ******'
public:
cDialog(QWidget* parent = 0);
signals:
void activateButtonClicked();
private:
QPushButton* activateButton;
QPushButton* quitButton;
QVBoxLayout* layout;
public slots:
void buttonActivated();
};
//新cDialog定义完毕
//
//
cDialog::cDialog(QWidget *parent):QDialog(parent){
activateButton=new QPushButton("Activate");
quitButton=new QPushButton("Quit");
quitButton->setEnabled(false);
layout=new QVBoxLayout;
layout->addWidget(activateButton);
layout->addWidget(quitButton);
setLayout(layout);
connect(activateButton,SIGNAL(clicked()),this,SLOT(buttonActivated()));
connect(quitButton,SIGNAL(clicked()),this,SLOT(close()));
}
//
void cDialog::buttonActivated(){
quitButton->setEnabled(true);
}
//
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
cDialog* firstDialog=new cDialog;
firstDialog->show();
return a.exec();
}
遇到的问题是,点击了Activate按钮后,Quit依旧是灰色的。。。。还请指教!~
vtable undefined?reference
------解决方案--------------------
void cDialog::buttonActivated(){
quitButton->setEnabled(true);
}
后面加个update试试
------解决方案--------------------
接上,你想让按钮点击,作用的是另外一个按钮啊,而不是你这个this(cdialog)接受。
------解决方案--------------------
加个断点,看看quitButton->setEnabled(true);执行了没,我按照你的写法写了个类似的是没问题的,也不存在楼上说的那种问题
------解决方案--------------------
一直用on_XXXX_clicked();
刚那个是我理解错了。
不过楼主你写的这个没有错吧……下面是我写的
#ifndef CDIALOG_H
#define CDIALOG_H
#include <QDialog>
#include <QtGui>
#include <QVBoxLayout>
class cDialog : public QDialog
{
Q_OBJECT
public:
cDialog(QWidget *parent = 0);
~cDialog();
private:
QPushButton *activateBtn;
QPushButton *quitBtn;
QVBoxLayout *layout;
public slots:
void activate();
};
#endif // CDIALOG_H
#include "cdialog.h"
cDialog::cDialog(QWidget *parent)
: QDialog(parent)
{
activateBtn = new QPushButton("activate");
quitBtn = new QPushButton("quit");
layout = new QVBoxLayout;
quitBtn->setEnabled(false);
layout->addWidget(activateBtn);
layout->addWidget(quitBtn);
setLayout(layout);
connect(activateBtn,SIGNAL(clicked()),this,SLOT(activate()));
connect(quitBtn,SIGNAL(clicked()),this,SLOT(reject()));
}
void cDialog::activate()
{
quitBtn->setEnabled(true);
}
cDialog::~cDialog()
{
}
#include "cdialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
cDialog w;
w.show();