如何将ui文件类中的按钮连接到其他类中的插槽



我有3个类。

  • 类的主窗口,该主窗口来自设计器(ui文件)
  • wich类将管理诸如插入之类的数据库内容
  • 控制器类。我想稍后将整个内容扩展到网络通信

我的问题:

我想将窗口类中的一个简单QPushButton ui->addbutton与数据库类中的插槽addEntry连接起来,但我得到了以下错误:

错误:对的调用没有匹配的函数'generalControler::connect(QPushButton*,const char*,dbmanager*&,const char*)'mydb,SLOT(addEntry()));//与&mydb或*mydb主窗口(0x13f57988,name="MainWindow")QPushButton(0x13f5f3e0,name="addButton")主窗口(0x13f57988,name="MainWindow")0x13f5f3e0//<--?????//<在这里你可以看到用Qdebug()打印的地址。top:主窗口类。bot:通用控制器类//为什么将一个"ui->addButton"的地址返回到另一个类后会丢失信息?这可能是问题所在吗?

main.cpp

#include <QApplication>
#include "generalcontroler.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
generalControler controler;
return a.exec();
}

通用控制器h

#ifndef GENERALCONTROLER_H
#define GENERALCONTROLER_H
#include <QApplication>
#include "mainwindow.h"
#include "dbmanager.h"
class generalControler : public QObject
{
Q_OBJECT
public:
generalControler();
};
#endif // GENERALCONTROLER_H

通用冷却器.cpp

#include "generalcontroler.h"
#include <QDebug>
generalControler::generalControler(){
MainWindow* window = new MainWindow;
window->show();
dbmanager* mydb= new dbmanager("path_to_my_database.db", window);
mydb->addEntry();
qDebug()<<window->getThis()<<window->getcloseButton();
connect(window->getaddButton(), SIGNAL(clicked()),
         mydb,                   SLOT(addEntry()));

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMessageBox>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QPushButton* getaddButton();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new    Ui::MainWindow){
ui->setupUi(this);
}
QPushButton* MainWindow::getaddButton()
{
    return ui->addButton;
}

dbmanager.h

#ifndef DBMANAGER_H
#define DBMANAGER_H
#include <QSqlDatabase>
#include <QDebug>
#include "mainwindow.h"
class dbmanager: public QObject{
Q_OBJECT
public:
dbmanager(const QString& path);
public slots:
void addEntry();
private:
QSqlDatabase mydatabase;
};
#endif // DBMANAGER_H

dbmanager.cpp

#include "dbmanager.h"

dbmanager::dbmanager(const QString& path)
{
mydatabase = QSqlDatabase::addDatabase("QSQLITE");
mydatabase.setDatabaseName(path);
if (!mydatabase.open())
{
    qDebug() << "Error: connection fail";
}
else
{
    qDebug() << "Database: connection ok";
}
}
void dbmanager::addEntry()
{
    qDebug()<<"addEntry success";
}

我搜索了6个小时,但从未见过这样一个包含2个类、一个控制器和一个ui文件的例子。有人能帮我吗?

我觉得连接不错。试试generalcontroler.cpp中的#include <QPushButton>是否有帮助。如果编译器只通过前向声明知道QPushButton,那么它不知道它是一个QObject,因此connect()签名(其中包含QObject*)不匹配。

最新更新