【问题标题】:How to connect a button from ui-file class to slots from other classes?如何将 ui-file 类的按钮连接到其他类的插槽?
【发布时间】:2016-07-28 13:38:47
【问题描述】:

我有 3 节课。

  • 带有来自设计器(ui-file)的主窗口的类
  • 类将管理诸如插入之类的数据库内容
  • 控制器类。我想稍后将整个事情扩展到网络通信。

我的问题:

我想将窗口类中的一个简单的QPushButtonui->addbutton 与数据库类中的插槽addEntry 连接起来,但是我收到了这个错误:

错误:没有匹配的调用函数 'generalControler::connect(QPushButton*, const char*, dbmanager*&, 常量字符*)' mydb,插槽(添加条目())); //与 &mydb 或 *mydb 没有区别 MainWindow(0x13f57988, name = "MainWindow") QPushButton(0x13f5f3e0, name = "addButton") MainWindow(0x13f57988, name = "MainWindow") 0x13f5f3e0//addButton'的地址返回给另一个类后会丢失信息?这可能是问题吗?

main.cpp

#include <QApplication>
#include "generalcontroler.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

generalControler controler;

return a.exec();
}

generalcontroler.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

generalcontroler.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 文件。谁能帮帮我?

【问题讨论】:

  • 显式调用QObject::connect(....); 会有所帮助吗?代码看起来不错...

标签: c++ qt signals-slots qt-signals


【解决方案1】:

连接对我来说看起来不错。试试generalcontroler.cpp 中的#include &lt;QPushButton&gt; 是否有帮助。如果编译器仅通过前向声明知道 QPushButton,它不知道它是一个 QObject,因此 connect() 签名(其中包含 QObject*)不匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多