连接主窗口类外的插槽

Posted

技术标签:

【中文标题】连接主窗口类外的插槽【英文标题】:connecting slots outside mainwindow class 【发布时间】:2013-03-31 09:28:09 【问题描述】:

我有一些 GUI(使用 QTableWidget 显示账单),我在 checkout.cpp 文件中的 MainWindow 类之外实现了这些 GUI。我在连接checkout.cpp 内的插槽时遇到问题。 由于MainWindow 类继承自QMainWindow,我可以将适当的槽函数与this 对象相关联。

如何在不继承自 QMainWindowQWidgetCheckOut 类中执行此操作?

编辑(代码):

CheckOut::CheckOut(string token)The CheckOut class does not inherit any other class. I am getting error: /home/sudeep/Desktop/mesonero project/mesonero-build-desktop-Qt_4_8_1_in_PATH__System__Release/../mesonero/management.cpp:29: error: no matching function for call to 'QObject::connect(QPushButton*&, const char [11], Management* const, const char [8])'
   CustomerToken = token;
   if(!findCustomer())
       QMessageBox::critical(0,QObject::tr("Check Out"),"Invalid Customer Token");
   else
           generateBill();
           provideDiscount();
           QPushButton *payButton = new QPushButton("Pay");
           QObject::connect(payButton,SIGNAL(clicked()),this,SLOT(deleteCustomer()));
           CustomerBill->layout()->addWidget(payButton);
       


void CheckOut::deleteCustomer()

       DatabaseManager *dbm = DatabaseManager::Instance();

       QSqlQuery query("DELETE FROM `Residing_Customer` WHERE Customer_Token = '"+QString::fromStdString(CustomerToken)+"'",dbm->db);
       query.exec();
       CustomerBill->close();

编辑(错误):

/home/sudeep/Desktop/mesonero project/mesonero-build-desktop-Qt_4_8_1_in_PATH__System__Release/../mesonero/checkout.cpp:29: error: no matching function for call to 'QObject::connect(QPushButton*&, const char [11], CheckOut* const, const char [8])'

【问题讨论】:

信号/槽和继承并不真正相关(除了你需要从 QObject 继承的事实)。目前还不清楚你有什么问题。您能否发布一些您无法开始工作的示例代码? 我认为 QMainWindow 继承了 QObject,因此如果该类继承自 QMainWindow,则可以执行 connect(....,....,QObject*,...)。 任何继承自 QObject 的东西都可以使用信号和槽(发射或连接)。我仍然不明白你没有管理什么。您在该代码中有一个连接调用,是什么阻止您在其他实例之间建立相同的连接? (上面连接中的payButtonthis 是指向QObjects 的指针。这是您唯一需要的。不需要其中一个是this。) 请查看编辑。我已经添加了错误。 CheckOut 必须继承自 QObject 如果你想使用信号和槽。 (什么编辑?) 【参考方案1】:

当你想使用槽和信号时,你需要在类的私有部分添加Q_OBJECT,并继承自QObject

您可以使用的任何 Qt 类都继承自 QObject,因此如果您继承自 QWidget,那么您也继承自 QObject

class CheckOut : public QObject 
Q_OBJECT
...

如果您将 QObject* 父级传递给您的 CheckOut 构造函数,您可能还需要使用该父级构建 QObject 子对象:

CheckOut::CheckOut(QObject* parent) : QObject(parent)  ... 

【讨论】:

构造函数实现怎么样,我需要在那里做一些改变吗? @sudeepdino008,如果您将 QObject* 父级传递给 CheckOut 构造函数,您可能还需要使用该父级构造 QObject 对象。 (有关完整示例,请参阅编辑)

以上是关于连接主窗口类外的插槽的主要内容,如果未能解决你的问题,请参考以下文章

在代码中连接信号和插槽并在 QtCreator“信号和插槽编辑器”窗口中设置它们有啥区别?

信号没有被其他类捕获

类外的成员函数定义

声明后初始化类外的数组

如何从类外的 RecordSet 中返回值?

让类成员函数调用类外的函数