在Linux下使用QT开发,为啥总提示成员函数没有定义呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Linux下使用QT开发,为啥总提示成员函数没有定义呢?相关的知识,希望对你有一定的参考价值。

在Linux下使用QT开发程序,总出现下面的提示:
.ui/../jyddform.ui.h:86: error: 'class JyUnldForm' has no member named 'setDdbh'
函数setDdbh()我已经在 JyUnldForm 中定义了,现在无论我在 JyUnldForm 中定义一个什么样的函数,其他的类都无法调用。
我重新定义一个工程,在里面添加的函数就没有问题。为什么啊,大家帮帮我。
我重新定义一个工程,用同样的方法定义一个函数,就可以调用。我把程序拷贝给同事,他也没有办法,感觉很奇怪,会不会是QT有问题呢?

如果你曾经成功编译过用Qt写的程序,我就不推荐你用configure来重编Qt了
推荐你去http://www.qtcn.org
参考技术A 不会吧,有这等怪事?
只要h文件中有声明,cpp文件中有定义的话都能找到的啊

Qt线程初步

默默地EEer,原文地址:

http://www.cnblogs.com/hebaichuanyeah/p/5618781.html

在调用linux环境下线程API写Cpp时,发现异常蛋疼,要么线程函数不能是类的成员函数,要么必须是类的static成员函数(意味着调用的成员变量也必须是static……其实还是不属于类)。

Qt提供一套线程机制,只要继承QThread基类并重新实现void run()函数即可。

新建thread.h继承Qthread,并在thread.cpp中实现它。

thread.h

 

#include "QThread"

class Thread : public QThread
{
    Q_OBJECT
public:
    Thread();
 //   void setMessage(const Qstring &message);
    void setRun();
    void stop();
    bool getState();
protected:
    void run();
private:
   // QString messageStr;
    volatile bool enable; 
signals:
    void OutMessage(QString message);
};

 

 thread.cpp,在run函数中循环1秒触发一个信号输出信息。

 

 

#include "thread.h"

Thread::Thread()
{
    enable = true;
}

void Thread::run()
{
    while(true)
    {
        if(enable)
        {
            this->OutMessage(tr("I\'m run : thread 1"));
            msleep(1000);
        }
    }
}
void Thread::stop()
{
    enable = false;
}
void Thread::setRun()
{
    enable = true;
}
bool  Thread::getState()
{
    return enable;
}

 

 mainwindow.h,定义一些Qt控件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QMainWindow>
#include <QLabel>
#include <QGridLayout>
#include <QPushButton>
#include <QTextEdit>
#include <QDoubleValidator>
#include <QComboBox>
#include <QTranslator>

#include "thread.h"

#define PI  3.14592653589

class MainWindow  : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow();
    ~MainWindow();
private:
    QWidget* mainWindow;
    QGridLayout * mainLayout;
    QTextEdit * messageEdit;
    QPushButton * clearButton;
    QPushButton * runStopButton;
    Thread * backThread;
private slots:
    void updateMessage(QString message);
    void clearMessage();
    void runStopThread();

};

#endif

 mainwindow.cpp

#include "mainwindow.h"
#include <QPainter>


MainWindow :: MainWindow()
{
    mainWindow = new QWidget;
    this->setCentralWidget(mainWindow);

    backThread = new Thread();
    backThread->start();


    clearButton = new QPushButton(tr("clear"));
    clearButton->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
    runStopButton = new QPushButton(tr("stop"));
    messageEdit = new QTextEdit();
    messageEdit->setReadOnly(true);
    mainLayout = new QGridLayout;

    mainLayout->addWidget(messageEdit,0,0,5,5);
    mainLayout->addWidget(clearButton,1,5,1,1);
    mainLayout->addWidget(runStopButton,0,5,1,1);

    mainWindow->setLayout(mainLayout);

    QObject::connect(clearButton,SIGNAL(clicked()),this,SLOT(clearMessage()));
    QObject::connect(runStopButton,SIGNAL(clicked()),this,SLOT(runStopThread()));

    QObject::connect(backThread,SIGNAL(OutMessage(QString)),this,SLOT(updateMessage(QString)));

    this->setWindowTitle(tr("thread test~"));
    this->resize(QSize(300,100));
 //   this->setFixedSize(200,100);
}

MainWindow :: ~MainWindow()
{
    mainWindow->deleteLater();
    mainLayout->deleteLater();
    messageEdit->deleteLater();
    clearButton->deleteLater();
    runStopButton->deleteLater();
}

void MainWindow::updateMessage(QString message)
{
    messageEdit->append(message);
}
void MainWindow::clearMessage()
{
    messageEdit->clear();
}
void MainWindow::runStopThread()
{
    if(backThread->getState())
    {
        backThread->stop();
        runStopButton->setText(tr("run"));
    }
    else
    {
        backThread->setRun();
        runStopButton->setText(tr("stop"));

    }     
}

 运行:

后台线程不断打印信息,通过run/stop按钮停止/启动。

 

同时,Qt提供一套线程同步机制

QMutex(互斥锁),QReadWriteLock(读写锁),QSemaphore(信号量),QWaitCondition(阻塞等待一个条件)。

使用都很简单,其中QWaitCondition,调用bool wait(QMutex *mutex, unsigned long time = ULONG_MAX)成员函数阻塞。 void wakeOne()和void wakeAll()唤醒一处和所有阻塞。(类似于C#里面的ManualResetEvent 类,.WaitOne()   .Set())

 

以上是关于在Linux下使用QT开发,为啥总提示成员函数没有定义呢?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在Windows下开发 QT 要用到 MinGW? 他的作用是啥?

在模板派生类中,为啥我需要在成员函数中使用“this->”来限定基类成员名称?

Qt程序,可能会提示没有合适的默认构造函数。

linux wget的时候提示没有到主机的路由

电脑为啥注册表总提示有问题,注册表是啥呀?

Qt线程初步