连接主窗口类外的插槽
Posted
技术标签:
【中文标题】连接主窗口类外的插槽【英文标题】:connecting slots outside mainwindow class 【发布时间】:2013-03-31 09:28:09 【问题描述】:我有一些 GUI(使用 QTableWidget
显示账单),我在 checkout.cpp
文件中的 MainWindow
类之外实现了这些 GUI。我在连接checkout.cpp
内的插槽时遇到问题。
由于MainWindow
类继承自QMainWindow
,我可以将适当的槽函数与this 对象相关联。
如何在不继承自 QMainWindow
或 QWidget
的 CheckOut
类中执行此操作?
编辑(代码):
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 的东西都可以使用信号和槽(发射或连接)。我仍然不明白你没有管理什么。您在该代码中有一个连接调用,是什么阻止您在其他实例之间建立相同的连接? (上面连接中的payButton
和this
是指向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
对象。 (有关完整示例,请参阅编辑)以上是关于连接主窗口类外的插槽的主要内容,如果未能解决你的问题,请参考以下文章