当前位置: 代码迷 >> QT开发 >> 初识Qt的小疑点,往大大路过指教
  详细解决方案

初识Qt的小疑点,往大大路过指教

热度:44   发布时间:2016-04-25 03:39:15.0
初识Qt的小问题,往大大路过指教
小弟自己想了一个小例子,思路如下
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试试
------解决方案--------------------
引用:
connect(sender,SIGNAL(signal),receiver,SLOT(slot));


接上,你想让按钮点击,作用的是另外一个按钮啊,而不是你这个this(cdialog)接受。
------解决方案--------------------
加个断点,看看quitButton->setEnabled(true);执行了没,我按照你的写法写了个类似的是没问题的,也不存在楼上说的那种问题
------解决方案--------------------
引用:
加个断点,看看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();
    
  相关解决方案