有没有办法判断信号是否已连接到某个功能?
即我想看看signals.siSelectionChange是否连接到任何东西
signals.siSelectionChange.connect( self.SelAsSiAssets )
Run Code Online (Sandbox Code Playgroud) 要使类的函数成为一个槽,该类必须从QObject继承.但是,QObject占用了相当大的内存.我不确定它是多少以及内存是针对每个类还是每个对象.我的代码有许多小数据,其功能有时可以是一个插槽.我很想知道是否有一种方法可以在使用它时使类的功能成为时间槽.使用后,将删除插槽成本的内存.以下代码说明了该要求.
class SmallData // size of 2 or 3 integers.
{
public:
virtual void F(); // use it as a slot.
virtual QMenu* createMenu(); // use this to create the context menu with
// an action connected to F()
...
};
// use the small data
vector<SmallData> vec(1000000); // the vector is put at a tree view. When an
// item in the tree view is selected, a context
// menu pop up with an action to run F().
SmallData* …Run Code Online (Sandbox Code Playgroud) 当QComboBox的currentIndex发生变化时,我需要用currentIndex + 1调用一个函数.今天早上我正在努力学习语法:
// call function readTables(int) when currentIndex changes.
connect(ui->deviceBox, SIGNAL(currentIndexChanged()),
SLOT( readTables( ui->deviceBox->currentIndex()+1) );
Run Code Online (Sandbox Code Playgroud)
错误:预期')'SLOT(readTables(ui-> deviceBox-> currentIndex()+ 1));
添加关闭)将无法正常工作......!
我有一个ConnectionManager方法的类get_wifi_ssids()必须返回一个SSID列表.问题是需要使用这些SSID信号和插槽,但我无法找到一种方法来检索该信息而无需先退出该方法.
这是从最低级别到最高级别使用的类的层次结构.
/** Controls wireless network card by commanding a software component "connman" via DBus. */
class WifiController : QObject {
Q_OBJECT
public:
void scan();
}
/** Low level interface to network interfaces. */
class NetworkController : QObject {
Q_OBJECT
public:
void scan_for_wifi() {
wifi_controller.scan();
// When scan is finished it sends the
// NetworkTechnology::scanFinished signal.
}
// Gets info from cache. This cache is updated when a `scan()` happens.
QList<AccessPointInfo> get_available_access_points;
private:
WifiController wifi_controller;
} …Run Code Online (Sandbox Code Playgroud) 我从 QTextEdit 派生了一个类并将其用作“日志”。我为它配备了一个插槽来接收日志消息。
class CLogbook : public QTextEdit
{
Q_OBJECT;
public:
void log(QString msg) {append(msg)};
public slots:
void recvLogSignal(const QString message)
{
append("hallo");
std::cout << "signal received.\n";
log(message);
}
Run Code Online (Sandbox Code Playgroud)
};
另一个类然后发出这样的信号:
// in the header
signals:
void logMessage(const QString);
// in the implementation
emit logMessage("qt is cute");
std::cout << "if you can read this the logMessage was emitted\n";
Run Code Online (Sandbox Code Playgroud)
我还将信号连接到插槽
connect(tableeditor, SIGNAL(logMessage(const QString)), logbook, SLOT(recvLogSignal(const QString)));
Run Code Online (Sandbox Code Playgroud)
但是,该消息从未显示在“日志”中。我在这里缺少什么?
已解决:发出信号后调用连接方法:-(
对于我的GUI,我希望有两对按钮可以在滚动条上下滚动.第一组按钮应该在说scrollarea1上工作,第二组按钮应该在scrollarea2上工作.我放在scrollarea中的小部件称为viewport1和viewport2.由于两组按钮都应该相同(向上和向下滚动),我想我会创建两个名为scrollUp和scrollDown的插槽来处理两组按钮的滚动.不幸的是,我无法完成这项工作,需要一些帮助.我尝试过以下方法:
QPushButton up;
QPushButton down;
QPushButton up2;
QPushButton down2;
connect(&up,SIGNAL(clicked()),&up,SLOT(scrollUp()));
connect(&up2,SIGNAL(clicked()),&up,SLOT(scrollUp()));
connect(&down,SIGNAL(clicked()),&down,SLOT(scrollDown()));
connect(&down2,SIGNAL(clicked()),&down,SLOT(scrollDown()));
void MainWindow::scrollDown()
{
QScrollArea area;
QWidget view;
if((QPushButton) &sender = down)
{
area=scrollArea;
view=viewport;
}
if((QPushButton) &sender = down2)
{
area=scrollArea;
view=viewport;
}
int curpos = area.verticalScrollBar()->value();
area.verticalScrollBar()->setValue(curpos+15);
int newpos = area.verticalScrollBar()->value();
QPoint topLeft = area.viewport()->rect().topLeft();
view.move(topLeft.x(),topLeft.y()-(newpos));
}
void MainWindow::scrollUp()
{
QScrollArea area;
QWidget view;
if((QPushButton) &sender = up)
{
area=scrollArea;
view=viewport;
}
if((QPushButton) &sender = up2)
{
area=scrollArea2;
view=viewport2;
}
int curpos = area.verticalScrollBar()->value();
area.verticalScrollBar()->setValue(curpos-15);
int …Run Code Online (Sandbox Code Playgroud) 我几乎是Qt的初学者.无论如何,一旦按下按钮,我正在尝试使用信号和插槽来显示小部件.我创建了小部件,并且完成了connect()这一切,但是我在SLOT()中添加了什么呢?我试过show(小部件),但老实说我不知道该放什么.
我已经搜索了大量的帮助讨论并阅读了多个教程,但我仍然不理解Qt信号和插槽的正确语法,使用Qt Core 5.0我创建了一个非常简单的程序,有两个对象来尝试理解这个语法.(如下所示).每次编译此代码时,都会收到以下错误:
'int'之前的预期primary-expression
请帮我解答以下问题:
我写的代码有什么问题?
Qt connect函数是否需要指向对象引用(&mySig)而不是直接指向对象?
当我使用包含参数的插槽和信号时,在连接功能中,我是否需要为这些参数提供变量,或者只是说明数据类型,如下面的代码所示?
最后,我想使用插槽和信号在我正在编写的程序中的对象之间传递数据.插槽和信号是否允许我传递从QObject派生的其他对象?或者我需要做一些额外的事情吗?
我看到许多对使用的connect语句格式的引用
QObject :: contect(&mySig,SIGNAL(sig_1(int)),&mySlot,SLOT(slot1(int)));
这种格式在Qt 5.0 Core下仍然有效吗?
非常感谢所有的帮助!简单程序代码如下.
#include <QCoreApplication>
#include <QObject>
#include <iostream>
using namespace std;
//================================================================================
class testSig : public QObject
{
Q_OBJECT
public:
explicit testSig(QObject *parent = 0) :
QObject(parent)
{
}
void getNum()
{
int t;
cout << endl << endl << "Please Enter Number: ";
cin >> t;
emit sig_1(t);
}
signals:
void sig_1(int i );
};
//================================================================================
class testSlot : public QObject
{
Q_OBJECT …Run Code Online (Sandbox Code Playgroud) 我正在使用Qt编写包含外部库的桌面应用程序.问题是我在包含外部库时遇到错误:
.../sc_containers.h:667: error: expected unqualified-id before ';' token
sc_array_t *slots;
^
Run Code Online (Sandbox Code Playgroud)
我成功地在包括非QT项目相同的库之前,所以我认为这个错误与Qt所使用的事实,slots作为一个特殊的关键字(见这里 Qt的文档).
有没有办法可以在我的程序中使用该外部库?由于这不是我自己的库,因此将变量名称更改为其他名称并不是一种选择.
提前致谢!
我编写了一个使用模板语法的子组件,子组件有一个槽将“item”属性传输给父组件,但父组件使用JSX语法,现在我很难在JSX中获取“item”属性。任何帮助将不胜感激!
// child.vue
<template>
<Autocomplete>
<template slot-scope="{ item }">
<slot :item="item" />
</template>
</Autocomplete>
</template>
Run Code Online (Sandbox Code Playgroud)
// parent.vue
export default {
render () {
return (
<Child>
<template slot-scope='{item}'>
<span>{item}</span> // item is not defined
</template>
</Child>
)
}
}
Run Code Online (Sandbox Code Playgroud)