我的GUI项目Qt
有很多"配置页面"类,它们都直接从中继承QWidget
.
最近,我意识到所有这些类共享2个公共插槽(loadSettings()
和saveSettings()
).
对此,我有两个问题:
BaseConfigurationPage
用这两个插槽作为虚拟纯方法编写一个中间基本抽象类(让它命名)是否有意义?(每个可能的配置页面总是有这两种方法,所以我会说"是")这是一个描述所有内容的代码示例:
class BaseConfigurationPage : public QWidget
{
// Some constructor and other methods, irrelevant here.
public slots:
virtual void loadSettings() = 0;
virtual void saveSettings() = 0;
};
class GeneralConfigurationPage : public BaseConfigurationPage
{
// Some constructor and other methods, irrelevant here.
public slots:
void loadSettings();
void saveSettings();
};
Run Code Online (Sandbox Code Playgroud) 我理解如何使用它,但它的语法困扰我.什么是"私人老虎机"呢?
我以前从未在private关键字和:之前的类定义中看到过.这里有一些奇特的C++魔法吗?
这里有例子:
#include <QObject>
class Counter : public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value);
...
Run Code Online (Sandbox Code Playgroud) Qt文档指出信号和槽可以是direct
,queued
和auto
.
它还声明,如果拥有插槽的对象'生命'在与拥有信号的对象不同的线程中,则发出此类信号就像发布消息一样 - 信号发出将立即返回,并且将在目标线程的事件循环中调用slot方法.
不幸的是,文档没有说明"生命"代表的是没有例子可用.我试过以下代码:
main.h:
class CThread1 : public QThread
{
Q_OBJECT
public:
void run( void )
{
msleep( 200 );
std::cout << "thread 1 started" << std::endl;
MySignal();
exec();
}
signals:
void MySignal( void );
};
class CThread2 : public QThread
{
Q_OBJECT
public:
void run( void )
{
std::cout << "thread 2 started" << std::endl;
exec();
}
public slots:
void MySlot( void )
{
std::cout << "slot called" << std::endl;
} …
Run Code Online (Sandbox Code Playgroud) 我们有一个QCheckBox
对象,当用户检查它或删除检查时我们想要调用一个函数,所以我们将函数连接到stateChanged ( int state )
signal.另一方面,根据某些条件,我们还会改变QCheckBox
代码内部的对象状态,这会导致不需要的信号.
在某些情况下有没有办法防止发射信号?
Boost.Signals允许使用槽的返回值的各种策略来形成信号的返回值.例如,添加它们,形成vector
它们,或返回最后一个.
常见的智慧(在Qt文档中表达[编辑:以及该问题的一些答案])是Qt信号不可能有这样的事情.
但是,当我在以下类定义上运行moc时:
class Object : public QObject {
Q_OBJECT
public:
explicit Object( QObject * parent=0 )
: QObject( parent ) {}
public Q_SLOTS:
void voidSlot();
int intSlot();
Q_SIGNALS:
void voidSignal();
int intSignal();
};
Run Code Online (Sandbox Code Playgroud)
不仅没有moc抱怨具有非void返回类型的信号,它似乎以允许返回值传递的方式主动实现它:
// SIGNAL 1
int Object::intSignal()
{
int _t0;
void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) };
QMetaObject::activate(this, &staticMetaObject, 1, _a);
return _t0;
}
Run Code Online (Sandbox Code Playgroud)
所以:根据文档,这件事是不可能的.那么moc在这做什么?
插槽可以有返回值,那么我们可以将带有返回值的插槽连接到具有返回值的信号吗?毕竟,这可能吗?如果是这样,它有用吗?
编辑:我不是要求解决方法,所以请不要提供任何解决方法.
编辑:它显然在Qt::QueuedConnection
模式中没用(QPrintPreviewWidget …
我想从C++向我的QML文件中的Slot发送一个Signal.我已经让它没有和原始类型参数工作,但如果我想发送QString
到我的QML插槽我连接时出错.
我在main.cpp中连接
QObject *contentView = rootObject->findChild<QObject*>(QString("contentView"));
QObject::connect(&myObj, SIGNAL(finishedGatheringDataForItem(QString)),
contentView, SLOT(updateViewWithItem(QString)));
Run Code Online (Sandbox Code Playgroud)
我的qml文件的相关部分
Rectangle {
objectName: "contentView"
function updateViewWithItem(string) { console.log('got some Items'); } // slot
}
Run Code Online (Sandbox Code Playgroud)
错误:
Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString)
Run Code Online (Sandbox Code Playgroud) 是否有可能有一个模板类,它继承自QObject(并在其声明中有Q_OBJECT宏)?
我想创建像插槽适配器这样的东西,它会做一些事情,但插槽可以采取任意数量的参数(参数的数量取决于模板参数).
我只是尝试这样做,并得到链接器错误.我猜这个模板类没有调用gmake或moc.有没有办法做到这一点?也许通过显式实例化模板?
我想在不使用QT的项目中使用信号/插槽库.我有很基本的要求:
我已经阅读了libsigc ++和Boost.Signals之间的比较.我还读到Boost.Signals的性能不佳.但是,我知道还有其他库,我仍然不确定应该选择哪个库.
有信号/插槽库的建议吗?
我已经看到了一些使用@ QtCore.Slot装饰器的PySide插槽的示例代码,有些则没有.自己测试一下,它似乎没有什么区别.有没有理由我应该或不应该使用它?例如,在以下代码中:
import sys
from PySide import QtCore
# the next line seems to make no difference
@QtCore.Slot()
def a_slot(s):
print s
class SomeClass(QtCore.QObject):
happened = QtCore.Signal(str)
def __init__(self):
QtCore.QObject.__init__(self)
def do_signal(self):
self.happened.emit("Hi.")
sc = SomeClass()
sc.happened.connect(a_slot)
sc.do_signal()
Run Code Online (Sandbox Code Playgroud)
@ QtCore.Slot装饰器没什么区别; 我可以省略它,调用@ QtCore.Slot(str),甚至@ QtCore.Slot(int),它仍然很好地说,"嗨."
PyQt的pyqtSlot似乎也是如此.
signals-slots ×10
c++ ×8
qt ×8
boost ×1
checkbox ×1
inheritance ×1
pyqt ×1
pyside ×1
python ×1
qml ×1
qt-signals ×1
return-value ×1
templates ×1