我正在尝试从QtGui.QPushButton对象列表创建一个简单的键盘。
class XKeyboard(QtGui.QWidget):
'''Special virtual keyboard for any language.'''
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.MainLayout = QtGui.QVBoxLayout()
self.TextEntry = QtGui.QTextEdit()
self.Keyboard = QtGui.QVBoxLayout()
self.MainLayout.addWidget(self.TextEntry)
self.MainLayout.addLayout(self.Keyboard)
self.setLayout(self.MainLayout)
def addRow(self, keys):
layout = QtGui.QHBoxLayout()
buttons = [QtGui.QPushButton(unicode(key)) for key in keys]
for button in buttons:
key = keys[buttons.index(button)]
layout.addWidget(button)
button.clicked.connect(
lambda key: self.keyClick(key))
self.keyClick(key)
self.Keyboard.addLayout(layout)
def keyClick(self, key):
self.TextEntry.insertPlainText(key)
Run Code Online (Sandbox Code Playgroud)
问题是lambda返回False而不是键。我究竟做错了什么?
我有一个QMenu动态构建的几个菜单项。
为此,我迭代了一组菜单项,其中包含名称和操作(如果菜单项被击中,则需要采取这些操作),并继续将它们添加到上下文菜单中。所有菜单项都需要连接到一个公共插槽。
但不知何故触发动作不会发生。即到达连接语句,但控制没有传递到指定的SLOT,不采取任何行动。
for (int i=0; i<Action_List.size();i++)
{
tempAct1 = Action_List.at(i); //Action List has the list of Actions
Context_Menu->addAction(tempAct1);
}
if (Context_Menu!=NULL) {
Context_Menu->exec(QCursor::pos());
int r = connect(Context_Menu, SIGNAL(triggered(QAction *)),
this, SLOT(SPlusCommand(QAction *)));
}
int P14MainWindow::SPlusCommand ( QAction* Action)
{
QVariant tempstr = Action->data();
QString Qs = tempstr.toString();
return QPwLocalClient::ExecuteCommand(Qs);
}
Run Code Online (Sandbox Code Playgroud)
谁能告诉我我哪里出错了,好吗?
我正在开发一个项目,我必须创建一个Qt信号槽连接,从类的构造函数到它在里面初始化的类.这就是代码的样子.我希望下面提到的连接都能正常工作,但从输出结果可知,只有连接#1有效.我的问题是如何使连接#2工作!
A级
class classA :public QWidget{
Q_OBJECT
public:
classA(){
emit this->demoSignalA();
}
signals:
void demoSignalA();
public slots:
void demoSlotA(){qDebug()<<"SIGNAL FROM CLASS B"}
};
Run Code Online (Sandbox Code Playgroud)
B级
class classB :public QWidget{
Q_OBJECT
public:
classB(){
classA *a = new classA;
connect(this, SIGNAL(demoSignalB()), a, SLOT(demoSlotA())); //WORKS
connect(a, SIGNAL(demoSignalA()), this, SLOT(demoSlotB())); //DOESN'T WORK
emit this->demoSignalB();
}
signals:
void demoSignalB();
public slots:
void demoSlotB(){qDebug()<<"SIGNAL FROM CLASS A";}
};
Run Code Online (Sandbox Code Playgroud)
主要
int main(int argc, char *argv[]){
QApplication a(argc, argv);
...
...
classB b; //INVOCATION INITIATED
return a.exec();
Run Code Online (Sandbox Code Playgroud)
} …
我有一个QTreeView其中每个节点代表一个数据对象。我设法将指向该数据对象的指针打包到 a 中QVariant,以便我知道在树中选择了哪个。我可以通过该函数访问节点currentIndex()。
树的根位于QStandardItemModel::invisibleRootItem()。其他节点由父节点函数添加appendRow。所以这些项目没有row,column我可以在 中使用QStandardItemModel::item()。
有没有办法给节点提供有效的坐标或检索没有坐标的项目。
我有一个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) 是否可以通过插槽传递变量,以便我可以打印出某些文本?试图将在另一个函数中定义的变量“ DiffP”传递给插槽。
“ DiffP”根据选择的文件而变化。
def addLineEdit(self):
try:
self.clearLayout()
self.FileButton ={}
self.Input = {}
self.TotalInput = []
for i in range(int(self.numberLine.text())):
self.FileButton[i] = QtWidgets.QPushButton(self.centralwidget)
self.FileButton[i].setText('Case {}'.format(i+1))
self.FileButton[i].setFlat(True)
self.FileButton[i].setMaximumSize(QtCore.QSize(50, 50))
self.hboxlayout[0].addWidget(self.FileButton[i])
self.FileButton[i].clicked.connect(lambda i=i: self.openfile(i))
self.buttonGroup.addButton(self.FileButton[i],i)
self.buttonGroup.buttonClicked['int'].connect(self.input)
def searchfile(self,dir):
with open(dir) as f:
content = f.readlines()
MainList = content[44].split()
RPM = round(float(MainList[0]), 2)
Ps = round(float(MainList[1]), 2)
Ts = round(float(MainList[2]), 2)
Pd = round(float(MainList[3]), 2)
Ratio = round(Pd / Ps, 2)
DiffP = round(Pd - Ps, 2)
@pyqtSlot(int)
def input(self,button_or_id,DiffP):
if isinstance(button_or_id, int): …Run Code Online (Sandbox Code Playgroud) 目的是将顶级类的信号TicTacToe与 QMainWindow 类连接。
它抛出一个错误:TicTacToe cannot be converted to PyQt5.QtCore.QObject in this context
#!/usr/bin/env python
from PyQt5.QtCore import (QLineF, QPointF, QRectF, pyqtSignal)
from PyQt5.QtGui import (QIcon, QBrush, QColor, QPainter, QPixmap)
from PyQt5.QtWidgets import (QAction, QMainWindow, QApplication, QGraphicsView, QGraphicsScene, QGraphicsItem,
QGridLayout, QVBoxLayout, QHBoxLayout,
QLabel, QLineEdit, QPushButton)
class TicTacToe(QGraphicsItem):
def __init__(self):
super(TicTacToe, self).__init__()
def paintEvent(self, painter, option, widget):
painter.setPen(Qt.black)
painter.drawLine(0,100,300,100)
def boundingRect(self):
return QRectF(0,0,300,300)
def mousePressEvent(self, event):
pos = event.pos()
self.select(int(pos.x()/100), int(pos.y()/100))
self.update()
super(TicTacToe, self).mousePressEvent(event)
messageSignal = pyqtSignal(int)
class MyGraphicsView(QGraphicsView): …Run Code Online (Sandbox Code Playgroud) 我有一个私有类成员变量status,我想在每次更改时发出一个带有其值的信号。因此,我使用Q_PROPERTY并指定了一个信号NOTIFY:
#ifndef CAMERACONTROL_H
#define CAMERACONTROL_H
#include <QObject>
#include <iostream>
class CameraControl : public QObject
{
Q_OBJECT
Q_PROPERTY(QString status MEMBER status NOTIFY statusChanged)
private:
QString status;
public:
explicit CameraControl(QObject *parent = nullptr);
~CameraControl();
void changeStatus()
{
std::cout << "changeStatus called" << std::endl; // The function definitely gets called!
this->status = "Change status again!";
}
public slots:
void outputStatus(const QString &status) {
std::cout << status.toStdString() << std::endl;
}
signals:
void statusChanged(const QString &status);
};
#endif // …Run Code Online (Sandbox Code Playgroud) 我有一个具有默认关键字参数的函数。我在执行此操作时遇到了麻烦,因为我不断收到一个错误,如果我的信号有两个参数,则需要传递两个参数。有没有办法解决?
class Controller(QWidget):
trigger = pyqtSignal(str, str)
def __init__(self):
self.trigger.connect(self.myfunc)
@pyqtSlot(str, str)
def function(argument, optional_argument=''):
do something
c = Controller()
c.trigger.emit('Hello', 'World') # This works
c.trigger.emit('Hello') # This fails and says I need 2 arguments
Run Code Online (Sandbox Code Playgroud) 我刚刚开始为即将到来的项目使用 PySide2 和 QML,我立即偶然发现了一个问题:如何将 python 类(继承自 QObject)发出的信号连接到 .qml 文件中的插槽?例如:我有一个 QThread(python 类),每 50 毫秒生成几个 xy 坐标。我想将生成的对添加到 QML 文件中定义的 LineSeries,以生成类似示波器的绘图。
这个问题可能真的很基本而且很愚蠢,但我真的需要一些帮助。
此致
兰多
编辑4:
我找到了解决方案,但我不太喜欢它。你能建议我(如果存在的话)一种更优雅的方法吗?
Python 代码:
class Manager(QObject):
dataReady = Signal(float,float)
def __init__(self):
QObject.__init__(self)
self._currX = 0
self._currY = 0
self._delay = 0.5
self._multiplier = 1.0
self._power = 1.0
self._xIncrement = 1.0
self._starter = False
self._threader = None
@Property(bool)
def starter(self):
return self._starter
@starter.setter
def setStarter(self, val):
print("New val: {0}, oldVal: {1}".format(val,self._starter))
if self._starter == val:
return
self._starter = val
if …Run Code Online (Sandbox Code Playgroud)