我需要一个QDialog来发送信号来重绘主窗口 但是连接需要一个对象来连接 所以我必须用new创建每个对话框并且每次都显式地放置一个connect()。
我真正需要的是一种从任何函数内部发送MainWindow :: Redraw()并在Mainwindow中有一个connect()来接收它们的方法。
但是你不能使信号静止,对话框显然不会从MainWindow继承。
编辑:
谢谢 - 我不想绕过信号/插槽。我想绕过主应用程序指针单例,如afxGetApp()。但是我不明白如何发出一个信号并将它汇集(或向下?)到我看到的主窗口。我把信号/插槽描绘成异常
答案 0 :(得分:3)
让客户将CustomRedrawEvents发布到QCoreApplication。
class CustomRedrawEvent : public QEvent
{
public:
static Type registeredEventType() {
static Type myType
= static_cast<QEvent::Type>(QEvent::registerEventType());
return myType;
}
CustomRedrawEvent() : QEvent(registeredEventType()) {
}
};
void redrawEvent() {
QCoreApplication::postEvent(
QCoreApplication::instance(),
new CustomRedrawEvent());
}
在CoreApplication实例上安装一个事件并连接到重绘信号:
class CustomRedrawEventFilter : public QObject
{
Q_OBJECT
public:
CustomRedrawEventFilter(QObject *const parent) : QObject(parent) {
}
signals:
void redraw();
protected:
bool eventFilter(QObject *obj, QEvent *event) {
if( event && (event->type()==CustomRedrawEvent::registeredEventType())) {
emit redraw();
return true;
}
return QObject::eventFilter(obj, event);
}
};
//main()
QMainWindow mainWindow;
QCoreApplication *const coreApp = QCoreApplication::instance();
CustomRedrawEventFilter *const eventFilter(new CustomRedrawEventFilter(coreApp));
coreApp->installEventFilter(eventFilter);
mainWindow.connect(eventFilter, SIGNAL(redraw()), SLOT(update()));
答案 1 :(得分:1)
一种简单的方法是简单地在静态方法QApplication :: topLevelWidgets()返回的所有小部件上调用repaint()。这避免了使用信号和插槽的需要。
答案 2 :(得分:0)
如果您想要支持正常的Qt习惯用法,那么您可以提供指向主窗口的全局指针。如果我理解正确的话,那应该为你提供所需的功能。